<div class="hub-textbox">
<h2>Before You Begin</h2>
<p>
This game may contain <b>mature themes</b> (violence, harsh survival, and adult subject matter). To continue, you must confirm that you are <b>18 years of age or older</b>.
</p>
<p style="margin-top:1em;">
<b>All characters depicted in sexual content are 18+.</b>
</p>
<p style="margin-top:1em;">
By selecting “Yes”, you confirm you are at least 18.
</p>
<div style="margin-top:1em;">
<<button "Yes (I am 18+)">>
<<goto "START">>
<</button>>
<<button "No (Take me back)">>
<<goto "Main_Menu">>
<</button>>
</div>
<p style="opacity:.8; font-size:0.9em; margin-top:1em;">
If you are under 18, please do not proceed.
</p>
</div><div class="intro-creation no-click-sfx">
Yes… of course. The name crystallizes in your consciousness. It has always been yours—long before you began.
The fragments coalesce: eyes that have witnessed endings yet to come, hair that dances in winds you remember feeling tomorrow, skin that bears scars from battles you have yet to fight. In this non-existent reflection, you see yourself becoming what you already were.
This place—simultaneously a forgotten home and an alien landscape—stirs something deep within you. The coldness surrounding you burns with an intensity that should be impossible. You walk paths you have never traveled, toward destinations you left behind long ago.
Your memories are prophecies of what has been. Your knowledge is a forgetting of truths you have yet to discover. You are ancient in your youth, newborn in your ageless wisdom. The void around you both contains everything and lacks substance, full of whispers that have yet to be spoken.
Thoughts emerge like intruders in your ancient-young mind. Fragments of what was and what might be again. They swirl around you, seeking purchase in your awakening consciousness. One thought rises above the others, pressing with an urgency that demands recognition:
<<button "What are you?">>
<<goto "What are you?">>
<</button>>
</div><<nobr>>
<div class="character-layout"><div class="character-panel">
<h2>STATS</h2>
<<characterStatPanel>>
</div><div class="character-panel">
<h2>POWERS</h2>
<<powerGrid>>
<div class="char-return">
<<return>>
</div>
</div></div>
<</nobr>>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>><<nobr>>
<<craftEnsure>>
<div class="craftui-root">
<div class="crafting-layout">
<!-- LEFT: recipe list -->
<div class="craft-panel craft-left">
<h2>CRAFTING</h2>
<div class="craft-hint">Pick a recipe on the left. Requirements turn green when met.</div>
<div id="craft-recipe-list"><<craftRecipeFilters>><<craftRecipeList>></div>
</div>
<!-- RIGHT: workbench -->
<div class="craft-panel craft-right">
<div id="craft-workbench">
<<craftDetailPanel>>
</div>
</div>
</div>
</div>
<</nobr>><div class="hub-textbox">
<h2>Victory… for now</h2>
<p>This fertile land is yours.</p>
<p>
Your enemies—your rivals, your victims—have all been bent and broken before you. The smoke has cleared. The screaming has faded. The earth remembers.
</p>
<p>
Yet you feel it, even in triumph: this is only the beginning. With each passing day, each passing year, something in you shifts—quietly at first— until you catch yourself thinking thoughts you never would have dared to name.
</p>
<p>
And when you look upon your people now, more than ever, you understand it: whether you raise them up or grind them down, your fate is tied to theirs. Wheter it will be a tie of love, necesity or duty...only time will tell.
</p>
<p>
Whichever path you choose forward only one question remains...where will that road lead you?
</p>
<hr>
<p><b>Thanks for playing!</b> That’s all for this version.</p>
<p>
If you enjoyed it and want to help me develop it further, please consider supporting me on <a href="https://www.patreon.com/cw/KaspeliProductions" target="_blank" rel="noopener">Patreon</a>.
</p>
<div style="margin-top:1em;">
<<button "Return to Main Menu">>
<<goto "Main_Menu">>
<</button>>
</div>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
Under the water's surface, the woman on the stone shudders violently. Her head lolls back, breaking the kiss as she struggles to stifle a cry, her mouth opening in a silent gasp of pleasure.
The ripples around her thighs give away the frantic rhythm of the other's fingers, pumping relentlessly into her. It is a raw, desperate display of sapphic lust, hidden yet brazen, playing out just feet away from the tribe's protector.
<<nsfwimg "images/events/Female_Love/SceneSolo.gif">>
They are rutting in a haze of fear and ecstasy, unaware that the danger they dread is already standing right there, watching their every move.
</div>''
</div>
<div class="hub-buttons">
<<button "Continue">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
As you finish setting up the camp, you feel it first—then see it.
Far off in the distance: smoke. And beneath the wind, voices.
Your tribe doesn’t seem to notice yet. But you do.
Life—dense and steady—gathered in one place. A community larger than any you have ever known… or remember.
Almost without deciding to, you drift away from your own fires and toward it.
Hours pass. Maybe days. The sun climbs, falls, climbs again— and you cannot bring yourself to care.
Then, at last—
you see it.
<img src="images/events/LakeFind/LakeCity.png" alt="Amogus">
A camp unlike any you have seen before.
No.
Calling it a 'camp' doesn’t do it justice.
This is something else.
A ''settlement''.
From a distant rise you watch it for a long while— the movement within, the steady rhythm of many lives. It pulls at your thoughts like a chant. Hypnotic.
You only break yourself free when you spot hunters moving along the outer paths.
For now, you slip away.
Back into brush and shadow, back through the thickets, back toward your own camp.
What you’ve seen here settles behind your eyes.
It gives you far too much to think about.
</div>''
<div class="hub-buttons">
<<button "End Event">>
<<endMajorEvent>>
<</button>>
</div>\:: Event_Major_TEMPLATE
<<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
<div class="hub-textbox">
(Event prose here.)
</div>
<div class="hub-buttons">
<<button "End Event">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
You move through the underbrush in silence.
Then you throw your spear.
It strikes with a crack, and by the time you push through the last of the brush, the deer is already on the ground, twitching as it dies. You approach without hurry, ready to retrieve your weapon and begin skinning it, when a scream tears through the trees.
“Aah—AAH!”
A man lunges at you from the side, thin as a corpse and clutching a crude knife.
He swings wildly. The blade bites shallowly into your flesh, just enough to draw blood. A few drops strike the trunk of the nearby tree.
You do not think.
Your fist lashes out and catches him full on.
He drops at once.
You turn, ready to strike again if needed, but the man does not move.
For a moment, you only stare at him. Then you kneel.
He is starving. Barely more than bones wrapped in skin. Hollow-eyed. Weak enough that a blow that should not have killed him, did. Perhaps you only ended something that had been ending for days already.
His face is unknown to you.
You search him and find nothing. No charm, no marking, no sign of tribe or kin. Only the knife, crude and worn, and a body the wild had already half-claimed.
By then, the cut he gave you has already closed.
So you rise, pull your spear from the dying deer, and finish your work.
When the skinning is done, you throw the hide and meat over your shoulder and start back toward camp.
But before leaving, you look back once.
At the dead man in the dirt.
At the deer beside him.
At the tree, broad and ancient, its roots half-bared from the earth.
And at the dark smear of your blood upon its bark.
Then you leave the place behind.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Leave the memory behind</span>">>
<<endMajorEvent>>
<</button>>
</div>\:: Event_Major_TEMPLATE
<<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
<div class="hub-textbox">
(Event prose here.)
</div>
<div class="hub-buttons">
<<button "End Event">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run setup.corruptSkull.spawnQuestAtBleedingTile()>>
<</silently>>
''<div class="hub-textbox">
Sleep comes unevenly that night.
At first there are only fragments. Broken things. Wind moving through branches. Wet roots shifting beneath dark soil. A shape half-buried where no shape should be.
Then the dream sharpens.
You are standing in a forest.
At first it is unfamiliar. You move forward, one step, then another, each carrying you farther than it should. The world shifts with every pace. Trees bend into different shapes. Shadows lengthen and recede. Ground that should take minutes to cross passes beneath your feet in moments.
Then you see it.
Before you rises a great tree.
It is familiar.
And yet not.
Greater than it was when you last stood before it.
Larger now. Older too. Its bark is darker, its roots thicker, as though the earth itself has tightened around them. Something lies at its base.
A body.
Thin. Barely more than bone and skin, half-caught in the roots as though the tree had grown around it, or perhaps through it. For a moment you simply stare. Its features are too far gone to make out clearly, worn down by time and decay.
And yet you know it.
The half-starved man who attacked you.
Then your gaze shifts upward.
From one of the thicker branches hangs the corpse of the beast you killed. The same deer whose hide and meat you carried back to camp.
Or what remains of it.
Its body sways without wind.
Its throat hangs open.
Thin dark lines run from it, down the bark, trailing like blood that never dried.
You wake before dawn, the image still clinging to the back of your mind.
At first you tell yourself it was nothing more than a strange dream.
Yet as the day wears on, the memory does not fade.
If anything, it grows sharper.
And before long, you realize something else too...
...You remember exactly where the tree stands.
<div class="result-list">
<div class="result-line good">
<span class="label">New Task added</span>
<span class="value">The Corrupt Tree</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Mark the place and return</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags.corruptSkullDestroyResolved>>
<<run setup.corruptSkull.destroyRelic()>>
<<set $questFlags.corruptSkullDestroyResolved = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You do not hesitate.
Whether out of wisdom, worry for your people, or simple exhaustion, you take the skull and cast it into the fire. When the flames first touch it, nothing happens.
Then the roots begin to writhe.
Several in camp recoil.
One man curses.
Another nearly drops the torch in his hand.
The bone blackens slowly, far slower than it should. The roots burn faster, curling and snapping in the heat with thin, wet sounds. A foul smell spills from the pyre, thick enough to turn the stomach. More than once, it almost seems as though the skull is trying to split itself open from within.
But in the end, fire does what fire was always meant to do.
It leaves little behind but ash and cracked fragments.
When it is done, the air itself feels lighter.
Not clean. That would be too strong a word.
But lighter.
Whatever that skull was, whatever it was becoming, it no longer matters.
The only thing that matters is that it is gone.
And your camp is safer for it.
<div class="result-list">
<div class="result-line good">
<span class="label">Effect</span>
<span class="value">Corrupt Skull removed</span>
</div>
<div class="result-line good">
<span class="label">Effect</span>
<span class="value">Relic bad events ended</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Let the fire finish its work</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags.corruptSkullKeepResolved>>
<<run setup.corruptSkull.upgradeRelic()>>
<<set $questFlags.corruptSkullKeepResolved = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You look at the skull.
At the blackened roots wrapped through it.
At the wet trails beneath its empty eyes.
At the fear in the faces around you.
And still, you do not burn it.
Perhaps that is exactly why you do not.
No one argues.
No one dares.
Not because they agree, but because something in your voice leaves no room for defiance. You stoop and take the relic in hand once more, pulling it free from the dead hunter’s body. As you do, its tendrils slide across your wrist and coil partway up your arm in a gesture that feels, disturbingly, almost affectionate.
The thing has changed.
What remains is sharper now.
Stronger.
Hungrier.
And as you hold it, you can feel that hunger answering something in you.
It is yours now.
Not to fear.
Not to flee from.
To command.
To use.
Behind you, the camp remains quiet.
Too quiet.
That is fine.
They understand.
And those who do not...
will.
<div class="result-list">
<div class="result-line good">
<span class="label">Relic upgraded</span>
<span class="value">Awakened Corrupt Skull</span>
</div>
<div class="result-line bad">
<span class="label">Effect</span>
<span class="value">Stage 2 relic events unlocked</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Claim what it has become</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run (function () {
const S = setup.corruptSkull.ensureState();
if (!S.upgradeHunterLossApplied) {
State.variables.pops = Math.max(0, Number(State.variables.pops ?? 0) - 1);
S.upgradeHunterLossApplied = true;
}
})()>>
<</silently>>
''<div class="hub-textbox">
It begins before dawn.
A scream tears through the camp, sudden and sharp enough to pull even the heaviest sleeper upright. By the time you rise, others are already moving. Weapons in hand. Voices low. Fear spreading faster than sense.
The source is found quickly.
Not far from where your things were kept.
At first, it looks as though the skull lies in the dirt.
Then your eyes adjust.
Not dirt.
A body.
Half-buried, twisted into the soil as though the earth had begun swallowing it whole.
One of your hunters.
No one admits to touching the relic. No one claims to have moved it. Yet there it is, resting atop the corpse in the pale half-light, glistening as though it had only just been dragged from fresh earth. The roots clinging to it are thicker now. Longer. Darker. Some have pushed fully through the eye sockets. Others snake downward into the dead man’s flesh, so deep and so tight that there is little doubt what they had been doing.
And from those hollow sockets, something wet runs slowly down the bone.
Not blood.
Not quite.
But close enough that no one present mistakes what it resembles.
For a long moment, the entire camp is silent.
No one steps closer.
Then someone whispers that the thing should have been burned the moment it was brought here.
Perhaps they are right.
Even now, looking at it, you can feel the same pull you felt beneath the tree.
Only stronger now.
More certain.
The relic has changed.
And somewhere deep inside, you know the truth of it.
It changed because of you...For you.
The choice before you feels simpler now than it did the first time.
Destroy it.
Or keep it.
<div class="result-list">
<div class="result-line bad">
<span class="label">Population lost</span>
<span class="value">-1</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Destroy the relic</span>">>
<<goto "Event_Major_CorruptTree_Destroy">>
<</button>>
<<button "<span class='choice-text'>Keep the relic</span>">>
<<goto "Event_Major_CorruptTree_Keep">>
<</button>>
</div>''<div class="hub-textbox">
One day, you find yourself with surprisingly little work to do. A rarity—and one that has only become rarer.
So you wander the camp for a while, without any real destination in mind.
And then you feel it.
A pair of eyes on the camp. On you.
It is not the first time you have noticed it—but it is the boldest it has ever been.
You turn at once toward the place the feeling came from.
By the time your gaze finds the bushes, whoever was there is already gone. All that remains is an empty gap in the brush and the clear signs of disturbed leaves and bent branches.
Someone was there.
Someone was watching.
And if you move now...if you choose to hunt them...you could still catch the trail.
What do you do?
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Go after them</span>">>
<<goto "Event_Major_EyesInDaytime_Pursue">>
<</button>>
</div><<silently>>
<<run setup.stopHeartbeat && setup.stopHeartbeat()>>
<<run if (setup.bleedingOverlay) { setup.bleedingOverlay.soundSrc = "sounds/heartbeat.mp3"; setup.bleedingOverlay.trackId = "heartbeat"; }>>
<<run setup.stopBattle ? setup.stopBattle() : (SimpleAudio.select("Battle") ? SimpleAudio.select("Battle").stop() : 0)>>
<<run setup.playAmputation ? setup.playAmputation() : (function () {
try {
if (setup.stopAllAudio) setup.stopAllAudio();
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("amputation")
: null;
if (tr) {
tr.loop(true);
tr.volume((setup.audio && setup.audio.getMusicVolume01) ? setup.audio.getMusicVolume01() : ((settings.masterVolume ?? 10) / 10));
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
}
if (State && State.variables) {
State.variables.musicState = State.variables.musicState || { playing:false, track:"", source:"" };
State.variables.musicState.playing = true;
State.variables.musicState.track = "amputation";
State.variables.musicState.source = "scene";
State.variables.introActive = false;
State.variables.mainThemeActive = false;
State.variables.battleActive = false;
}
} catch (e) {}
})()>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _failedMissingScouts = false>>
<<set $questFlags["eyes_in_daytime_done"] = true>>
<<if $quests and $quests.length>>
<<for _qf = 0; _qf < $quests.length; _qf++>>
<<if $quests[_qf] and String($quests[_qf].id) is "q_kael_missing_scouts_01" and String($quests[_qf].status) is "active">>
<<set $quests[_qf].status = "failed">>
<<set $quests[_qf].markerRevealed = false>>
<<set $quests[_qf].desc = "Kael died before the missing scouts could be recovered. The search died with him.">>
<<set $quests[_qf].objective = "Failed">>
<<set _failedMissingScouts = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if _failedMissingScouts>>
<<set $questFlags["q_kael_missing_scouts_01_failed"] = true>>
<<set $questFlags["q_kael_missing_scouts_01"] = false>>
<<if String($trackedQuestId ?? "") is "q_kael_missing_scouts_01">><<set $trackedQuestId = "">><</if>>
<<if $trackedQuestIds and $trackedQuestIds.length>>
<<set $trackedQuestIds = $trackedQuestIds.filter(function (id) { return String(id) !== "q_kael_missing_scouts_01"; })>>
<</if>>
<<if $untrackedQuestIds and $untrackedQuestIds.length>>
<<set $untrackedQuestIds = $untrackedQuestIds.filter(function (id) { return String(id) !== "q_kael_missing_scouts_01"; })>>
<</if>>
<</if>>
<<addQuestMarkerless
"q_getting_even"
"Getting Even"
"Kavonok struck your camp, slew Kael, and left with your blood on his spear."
"This is not over.(Authors Note: Its Over for now! More content to come so stay tuned!)"
""
>>
<</silently>>
''<div class="hub-textbox">
You can’t stand anymore.
So you don’t.
You drop to your knees right there in the blood and mud as Halona rushes to your side.
“Stay conscious. Don’t fall asleep.”
She orders it sharply, though the concern in her voice still forces its way through.
Yet you already know you will live.
It took longer than usual, but the wound is healing now, as all your wounds eventually do.
Instead, your eyes drift toward the man whose body has no such gift.
Kael lies on the ground, breathing hard. Even that is broken by the blood filling his throat.
At his side kneels a small, familiar boy.
Aedan.
He clings to him with both hands, tears running openly down his face.
“Dad... don’t—” he chokes out. “You’ll be fine. Old Morag will fix you up with herbs, o-or the chieftain will do something. Just... please don’t.”
“Aedan.”
Kael forces the name out in a voice that is still stern, even now.
Then he looks at you.
He cannot speak much more. He only gives you one last nod.
But you have known Kael since he was a child himself.
You know what it means.
I leave the rest to you.
Then his gaze returns to Aedan.
“Don’t cry, Aedan...” he rasps. “You carry my blood. Do not shame it... Live for the tribe... as I did... Protect it... as—”
The hand gripping Aedan loosens.
His fingers slacken.
And the last light leaves his eyes.
Kael, son of the last chieftain.
Your right hand.
Is no more.
The survivors of your tribe look on in silence.
Sobs can be heard.
Curses.
The air is thick with grief and all that follows in its wake.
Sadness.
Anger.
Fury.
And the need for vengeance.
Then, slowly, their eyes turn to you.
To their hope.
Their chieftain.
The arbiter of their will.
They look to you now—
awaiting judgment.
<div class="result-list">
<div class="result-line bad">
<span class="label">Population lost</span>
<span class="value">-<<print $ambushPopLoss>></span>
</div>
<div class="result-line bad">
<span class="label">Lost</span>
<span class="value">Kael</span>
</div>
<<if $questFlags and $questFlags["eyes_in_daytime_used_spark"]>>
<div class="result-line bad">
<span class="label">Belief spent</span>
<span class="value">-<<print Number(setup.powerById("spark") ? (setup.powerById("spark").cost ?? 20) : 20)>></span>
</div>
<</if>>
<div class="result-line good">
<span class="label">New quest</span>
<span class="value">Getting Even</span>
</div>
<<if _failedMissingScouts>>
<div class="result-line bad">
<span class="label">Task failed</span>
<span class="value">The Missing Scouts</span>
</div>
<</if>>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<run (function () {
try {
if (setup.stopAllAudio) {
setup.stopAllAudio();
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("amputation")
: null;
if (tr) tr.stop();
}
if (State && State.variables && State.variables.musicState) {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
<<if $ambushChoice is "retribution">>
The girl goes rigid beneath you. All the fight drains out of her limbs, leaving her heavy and limp like a sack of grain. She turns her face to the side, pressing it into the dirt and decaying pine needles, squeezing her eyes shut as if by blocking out the light she can also block out what is happening to her body. Her breathing is shallow and rapid, her small chest shivering against your own.
You grip her hips, fingers sinking into the soft flesh of her ass to hold her steady. There is no need for force anymore; she accepts the inevitability of it. The head of your cock pushes against her dry, unyielding entrance. Her body is tense, the muscles locked up in fear, making the initial penetration a struggle of friction and heat.
You thrust forward.
The resistance is overwhelming. Her cunt is a tight, scorched ring that refuses to yield. You feel the skin stretch thin, a groan escaping your lips at the sheer pressure building behind the glans. With a hard, sudden shove, you force your way through.
Her body jerks once, a sharp intake of air that she doesn't let out.
<img src="images/events/ambush/bait.gif" alt="Amogus">
You bury yourself to the hilt. The sensation is suffocating, her inner walls clamping down uncontrollably around your invading shaft.
She is incredibly tight, a furnace of heat that grips every vein and ridge of your cock.
You begin to move, withdrawing slowly before driving back in. Her body rocks with the rhythm of your thrusts, her head lolling limply against the ground. The only sounds are the wet squelch of blood and fluid, the heavy rustle of your bodies moving in the undergrowth, and the soft, broken whimpers she tries to suppress.
<</if>>
<<if $ambushChoice is "questions">>
You decide to ask her a few questions. What tribe she belongs to. What she was doing here. Why she was watching your camp.
You get nothing from her but silence and the sound of heavy, panicked breathing.
As your patience thins and your grip tightens—
<</if>>
<<if $ambushChoice is "sway">>
You let the soft hook of your will slip into her thoughts.
Fear does the rest.
Her lips part. Her breath catches. A single broken thought strains loose through the panic.
“Camp—”
It is all she manages. As her hand subconciously reaches for you
<</if>>
But something cuts through your focus.
Even from this far out, your senses catch it.
Commotion from the direction of camp.
The smell of blood.
You stop at once.
Shoving the woman aside, you are already moving before she can hit the ground.
Then you sprint back toward camp as fast as your body will carry you.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_EyesInDaytime_RushBack">>
<</button>>
</div><<silently>>
<<set _spark = setup.powerById("spark")>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 20) : 20)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
<<set _canSpark = _hasSpark and Number($belief ?? 0) >= _sparkCost>>
<<if _canSpark>>
<<set $belief = Number($belief ?? 0) - _sparkCost>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["eyes_in_daytime_used_spark"] = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
A scream cuts across the camp.
Not one of yours.
One of his.
Then the rush comes.
Three men burst from the woods—ragged, bloodied, feral in appearance, but with a clear purpose burning in their eyes. Two hurl themselves at the nearest raiders, carving open a path through the chaos. The third drives straight through it.
Toward you.
Toward Kavonok.
Before Kavonok can fully turn, a knife flashes for his throat. He twists just in time. The blade fails to sink deep, but still bites into the flesh near his neck, drawing blood.
“Sloppy.”
The voice is familiar.
Kael.
His tone is his usual one—flat, steady, if just a little rougher now, a little drier.
He drives the knife harder with both hands.
Kavonok’s expression shifts from surprise to amusement.
“I could say the same for you, rat.”
His spear arm moves.
A small motion.
Almost lazy.
Kael does not flinch.
Instead, he turns his head and looks at you. Even now, he gives you the barest nod.
Then he lets go of the knife entirely and throws his weight forward, twisting his body around Kavonok’s larger frame and locking him in place.
For the first time, Kavonok sounds something close to disappointed.
“What are you—”
Then he understands.
“What a fool.”
His spear arm finishes its motion.
There is a violent flash.
Kael’s right shoulder comes apart in a burst of blood and torn flesh—
but he still does not let go.
With his remaining arm, he holds Kavonok in place for one heartbeat more.
“Persistent,” Kavonok mutters, more annoyed now than amused.
Then he finally tears free, shoving Kael off him hard enough to send the wounded man crashing to the ground.
And as he turns back—
<<if _canSpark>>
Snap.
The sound of your fingers cuts through the ringing in your skull as you force yourself upright.
A small white flame slips into being—quiet, almost insignificant.
Then it is already there.
Already next to him.
It brushes his side with the lightest touch—
and Kavonok erupts.
“AAAH!”
For the first time, his voice loses that easy shape. He staggers as the white fire devours cloth and skin alike, racing across him faster than any natural flame.
But Kavonok is a survivor.
One of his own men rushes in, perhaps to help, perhaps only too slow to flee. Kavonok seizes him by the throat, drags him bodily into the fire, and forces the burning body against himself like a living shield. Flesh blackens. Fat bursts. The other man’s screams barely last a second before Kavonok hurls the corpse aside and tears free of what remains of the flame, half-smothered in blood, ash, and ruined meat.
When he straightens again, new burns scar his skin. His crude mask hangs broken, revealing older marks beneath it.
He laughs.
But the laugh does little to hide the fury in his eyes.
“Hah! So you have tricks of your own.” He wipes soot and blood from his mouth with the back of one hand. “Amazing. No wonder the little fire-starter ran to you. With magicks like that, she’ll fit right in.”
<<else>>
You are moving before the pain can stop you.
Your teeth grit.
Your arm draws back.
And with everything left in you, you drive your fist into his chest.
You hear something break.
Kavonok is hurled backward, crashing into his own men hard enough to send bodies sprawling in every direction.
For a moment he stays down.
Then he rises with a groan, one hand pressed to his ribs. A chuckle escapes him—
and turns into a cough.
He rolls his neck, then looks at you with something like genuine appreciation.
“Strong bastard, aren’t you?”
<</if>>
He says it while watching you sway on your feet, measuring what little each of you has left.
Then a thin line of blood slips from the corner of his mouth.
He touches it.
Then his fingers move to the wound near his collarbone.
His eyes drift down to Kael’s dying body.
“A rat until the end, this one.”
He wipes the blood from his mouth, and when he looks back at you, the casual smile has already returned.
“Well,” he says lightly, “it seems we’re both a bit worn out. Why don’t we leave this for another time?”
His smile widens.
“I’m sure we’ll have plenty of other fun things to show each other by then.”
He does not wait for an answer.
He gives a small signal, and his men begin to fall back at once, slow and disciplined, watching you and what remains of your tribe the whole while.
For now, they retreat.
For now—
it is over.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_EyesInDaytime_Aftermath">>
<</button>>
</div>''<div class="hub-textbox">
What you see is a young man, though there is something in his smile that makes the word feel wrong.
He is large—broad through the shoulders, thick with the kind of strength that looks effortless rather than earned. Dark hair is braided back from his face, and one side of it is hidden behind a rough, primitive mask strapped over an old burn wound, as though he had chosen to turn disfigurement into ornament.
Fur hangs from his shoulders, while bone and carved trophies crowd his chest and belt. A spear with a strange, glowing violet tip rests lazily across his shoulders, and from his belt hang several half-rotted heads, swaying gently with every step.
With an easy smile, he asks,
“You must be $user, right? Heard a lot about you.”
He looks you over for a moment.
<<if $height < 190>>
His smile widens a fraction.
“Though you’re a bit shorter than I expected.”
<<else>>
His smile widens a fraction.
“A large man. That’s good. A chieftain should be large.”
<</if>>
An unnatural silence settles over the camp. Not the kind that should ever fall in the middle of a raid—and yet it is the raiders who make the least noise.
Then the man continues.
“I prepared a little hunt for you earlier. I take it you enjoyed it? I even used one of my own concubines, just to be polite.”
He tilts his head, the smile never leaving his face.
“You didn’t kill her after you were done, I hope. I was rather fond of her.”
There is no real concern in his voice. If anything, he sounds only mildly curious.
At your silence, he lets out a small sigh and scratches idly at the side of his head.
“Not the talkative sort, then? That’s a shame. I had high expectations.” His eyes flick lazily across you. “Usually the chieftains of these little tribes either grovel…” He gives a casual wave in your direction. “…or they get that proud, stoic look. It’s all very stale.”
You do not answer.
You simply begin to close the distance.
He does not bother to move.
“Straight to business, then? Alright.” His smile sharpens, just slightly. “I’ll go first.”
Still casual, he reaches down to his belt and unhooks one of the heads hanging there. Then he tosses it at your feet.
It rolls through the dirt before coming to a stop.
You know the face.
One of your hunters.
One who had gone with Kael on the scouting mission.
The man watches you as your eyes settle on the half-decomposed head.
<img src="images/events/ambush/head.png" alt="Amogus">
“Familiar, then?” he asks lightly. “He was one of the rats we found scurrying around our city. Though, to be fair to them, they were a little unlucky with their timing. I was just on my way out to come pay you a visit when we stumbled over them.”
A whisper spreads through your people.
Then a woman cries out.
The man pays it no mind. He just keeps watching you.
Then, when your eyes lift to meet his, he goes on:
“Come now, don’t look at me like that, $user. What did you expect was going to happen?” He shrugs lightly. “First you kill my men. Then you save little fire-starters and their weakling brothers. Then you send your own men creeping into my lands.”
He smiles again.
“I had to answer.”
His eyes move briefly across the camp, almost as if searching.
“Oh—where is Halona, by the way? I did try to find her, bu—”
You move.
One step.
Then another.
</div>''
<div class="hub-buttons">
<button class="js-slash-transition macro-button" data-slash-target="Event_Major_EyesInDaytime_Slash1" data-slash-mode="wound" data-slash-black-start="140" data-slash-switch="260" data-slash-black-hold="950" data-slash-fade-in="2000" data-slash-shake="110" data-slash-heartbeat="1" data-slash-heartbeat-delay="0">
<span class='choice-text'>Crush him</span>
</button>
</div><<silently>>
<<set $ambushChoice = null>>
/* Wisdom read: something is off */
<<set _ambushWisDC = 13>>
<<set _ambushWisRoll = random(1, 20)>>
<<set _ambushWisStat = Number($wisdom ?? 0)>>
<<set _ambushWisTotal = _ambushWisStat + _ambushWisRoll>>
<<set $ambushWisCheck = {
ok: (_ambushWisTotal >= _ambushWisDC),
statKey: "wisdom",
stat: _ambushWisStat,
roll: _ambushWisRoll,
dc: _ambushWisDC,
total: _ambushWisTotal
}>>
/* Sway lock */
<<set _hasSway = !!($powersOwned and $powersOwned.sway)>>
<</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if $ambushWisCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom + d20 vs DC</span>
<span class="value"><<print $ambushWisCheck.total>> / <<print $ambushWisCheck.dc>></span>
</div>
</div>
You decide to pursue.
You lunge toward the woods with a speed few humans could match, taking off after the watcher without hesitation. Tree, thicket, brush—you cut past them all, feeling the distance between you shrink with every passing second.
Then, at last, you see her clearly.
A woman.
Small. Pretty. Quick enough on her feet—but not quick enough.
She runs like someone trying desperately to escape.
And yet she is too easy to catch.
One moment passes, then another.
And then you are on her.
You drive her to the ground with ease and pin her there before she can so much as twist free. Taking a closer look, you find wide, frightened eyes staring back at you. She looks terrified.
Yet she says nothing.
She only breathes—quick, shallow, panicked breaths.
<<if $ambushWisCheck.ok>>
…But something is wrong.
She is no hunter. No true scout either. She is too lightly built for a hard chase, too frightened, too unprepared. And if she truly meant to flee, she should never have let herself be seen so clearly in the first place.
No.
This feels wrong.
Not like prey caught by chance.
Like bait.
<</if>>
In the end, the strong rule and decide. Such is the law of nature.
So the question remains.
What do you want to do?
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Have retribution</span>">>
<<set $ambushChoice = "retribution">>
<<goto "Event_Major_EyesInDaytime_BaitResolve">>
<</button>>
<<button "<span class='choice-text'>Ask questions</span>">>
<<set $ambushChoice = "questions">>
<<goto "Event_Major_EyesInDaytime_BaitResolve">>
<</button>>
<<if _hasSway>>
<<button "<span class='choice-text'>Ask questions… persuasively</span>">>
<<set $ambushChoice = "sway">>
<<goto "Event_Major_EyesInDaytime_BaitResolve">>
<</button>>
<<else>>
<span class="macro-button disabled" title="You have not acquired Sway.">
<span class="choice-text">Ask questions… persuasively</span>
</span>
<</if>>
<<if $ambushWisCheck.ok>>
<<button "<span class='choice-text'>Rush back to camp</span>">>
<<set $ambushChoice = "rush">>
<<goto "Event_Major_EyesInDaytime_RushBack">>
<</button>>
<</if>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* Strength beat on first two raiders */
<<set _ambushStrDC = 13>>
<<set _ambushStrRoll = random(1, 20)>>
<<set _ambushStrStat = Number($strength ?? 0)>>
<<set _ambushStrTotal = _ambushStrStat + _ambushStrRoll>>
<<set $ambushStrCheck = {
ok: (_ambushStrTotal >= _ambushStrDC),
statKey: "strength",
stat: _ambushStrStat,
roll: _ambushStrRoll,
dc: _ambushStrDC,
total: _ambushStrTotal
}>>
/* Casualties only apply once */
<<if !$questFlags["eyes_in_daytime_casualties_applied"]>>
<<set _lossDiv = (($ambushChoice is "retribution") or ($ambushChoice is "questions")) ? 3 : 4>>
<<set _popNow = Math.max(0, Number($pops ?? 0))>>
<<set _baseLoss = Math.ceil(_popNow / _lossDiv)>>
/* Failed strength check = +1 extra pop lost */
<<if not $ambushStrCheck.ok>>
<<set _baseLoss += 1>>
<</if>>
<<set $ambushPopLoss = Math.min(_popNow, _baseLoss)>>
<<set $pops = Math.max(0, _popNow - $ambushPopLoss)>>
<<set $questFlags["eyes_in_daytime_casualties_applied"] = true>>
<<else>>
<<set $ambushPopLoss = Number($ambushPopLoss ?? 0)>>
<</if>>
<</silently>>
<<run setup.playBattle && setup.playBattle()>>
''<div class="hub-textbox">
<div class="result-list">
<<if $ambushStrCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Strength + d20 vs DC</span>
<span class="value"><<print $ambushStrCheck.total>> / <<print $ambushStrCheck.dc>></span>
</div>
</div>
When you return to camp, you return to slaughter.
Your men are either dead already or fighting for their lives. Women are being dragged through the dirt by their hair, screaming, while others lie still among the bodies.
A little farther from the thickest fighting, a few of the intruders seem almost relaxed. One drags a struggling woman along behind him while speaking to the others in a tone so casual it almost sounds like camp chatter.
“They were lightly defended. Harder raiding those weaklings from NPCTribe 2 last seaso—”
You do not stop to think.
You cannot afford to.
You move.
You seize the speaking man by the head.
<<if $ambushStrCheck.ok>>
For a second—then two—his skull holds.
Then it bursts in your grip like overripe fruit.
Before his companion can even understand what he has seen, you drive the body into him with enough force to send them both crashing to the ground.
<<else>>
You wrench him off his feet and hurl him bodily into his companion, sending both sprawling into the dirt. Before either can recover, your hand finds a fallen spear. In one motion, you drive it down through the first man and into the second beneath him, pinning them both to the earth.
<</if>>
You do not stop.
You do not even spare a glance for the woman you just saved.
You are already moving toward the thickest fighting.
Then comes only violence.
You tear through the camp like a storm given flesh. A raider lunges; you break his arm before he can bring his blade down, then crush his throat beneath your hand. Another tries to pull back and shout a warning, only for your weight to hit him hard enough to fold him into the mud. Spears splinter. Blood soaks the trampled ground. Men die without understanding what has reached them.
For a few brief, savage moments, the attack falters.
Your people rally where they can. The raiders nearest you begin to give ground.
And then—
A voice drifts across the chaos.
Light. Amused.
The sort of tone a man might use when interrupting a noisy meal rather than a massacre.
“Now, now,” it says. “You’re all getting carried away.”
The fighting stutters.
Not because the raiders have suddenly grown merciful—
but because every one of them knows exactly who has just spoken.
And none of them wish to disappoint him.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Turn to look</span>">>
<<goto "Event_Major_EyesInDaytime_Kavonok">>
<</button>>
</div><<silently>>
<<set _ambushEndDC = 13>>
<<set _ambushEndRoll = random(1, 20)>>
<<set _ambushEndStat = Number($endurance ?? 0)>>
<<set _ambushEndTotal = _ambushEndStat + _ambushEndRoll>>
<<set $ambushEndCheck = {
ok: (_ambushEndTotal >= _ambushEndDC),
statKey: "endurance",
stat: _ambushEndStat,
roll: _ambushEndRoll,
dc: _ambushEndDC,
total: _ambushEndTotal
}>>
<<if not $ambushEndCheck.ok>>
<<set $endurance = Math.max(0, Number($endurance ?? 0) - 1)>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if $ambushEndCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Endurance + d20 vs DC</span>
<span class="value"><<print $ambushEndCheck.total>> / <<print $ambushEndCheck.dc>></span>
</div>
<<if not $ambushEndCheck.ok>>
<div class="result-line bad">
<span class="label">Endurance lost</span>
<span class="value">-1</span>
</div>
<</if>>
</div>
Darkness.
Only for a moment.
Then you are moving again—backward, stumbling, breath catching.
What happened?
You look at the man.
He has not moved.
Or at least, you do not think he has.
For one strange heartbeat, the world feels out of joint, as though something between you and him had folded inward and then snapped back into place.
Then you feel it.
Wetness across your chest.
You bring a hand to your pecs and pull it away slick with blood.
Blood.
This is not the first time you have seen your own.
But it is the first time you have seen this much of it.
And the first time the wound has not already begun to close.
The spear never should have reached you from that distance.
Yet it did.
No—
not quite.
It feels less like the weapon crossed the space between you, and more like the space itself gave way and let the strike happen anyway.
<<if $ambushEndCheck.ok>>
The wound is not deep.
And yet your legs feel strangely unsteady beneath you, as if the cut stole more than flesh.
<<else>>
Standing becomes difficult at once.
Your body wavers. The ground beneath you turns uncertain.
Still, you remain upright.
You must.
<</if>>
The man studies you, then lifts an eyebrow.
“Hm? Still standing?” He sounds almost amused. “That’s a first.”
His gaze drops to the glowing spearhead, now wet with your blood.
“Maybe I should sharpen it…”
He tilts it slightly, inspecting the edge as though musing over a kitchen knife.
Then he looks back at you and smiles.
“…Well. Later.”
His grip shifts.
“Let’s finish this.”
And before he is even close enough to strike—
</div>''
<div class="hub-buttons">
<button class="js-slash-transition macro-button" data-slash-target="Event_Major_EyesInDaytime_Slash2" data-slash-mode="wound" data-slash-black-start="140" data-slash-switch="260" data-slash-black-hold="600" data-slash-fade-in="1400" data-slash-shake="110">
<span class='choice-text'>A slash</span>
</button>
</div><<silently>>
<<run setup.stopHeartbeat && setup.stopHeartbeat()>>
<<run if (setup.bleedingOverlay) { setup.bleedingOverlay.soundSrc = "sounds/heartbeat.x1.5.mp3"; setup.bleedingOverlay.trackId = ""; }>>
<<run setup.playHeartbeat && setup.playHeartbeat({ restart: true })>>
<</silently>>
''<div class="hub-textbox">
Another strike lands.
This one bites into your shoulder.
You still cannot make sense of it—not with blood pouring from you, not with your thoughts slipping every time that glowing point moves.
Then, suddenly, he is standing right in front of you.
But he is not looking at your face.
He is looking at his spear.
The violet light at its tip has grown brighter now, fed by your blood until it almost seems alive.
“Hmm,” he says softly. “You’re a special thing, $user, aren’t you?”
His eyes remain fixed on the glow.
“Last time I wanted it to shine like this, I had to feed it the blood of ten tribesmen.”
Only then does he look up at you again, smiling.
“With you, one stab does the same.” His smile widens. “I wonder what would happen if I took all of it.”
He tilts his head.
“Let’s find out.”
He still has not fully moved.
And yet you feel it coming.
Something worse than death.
Not death.
No.
This is the fear of being emptied out. Of being taken apart so completely that nothing of you remains. Not body. Not thought. Not self.
You brace for it—
“KAVONOK!”
The shout cuts across the camp.
A woman’s voice.
Halona’s.
His attention shifts at once. Slowly, almost lazily, he turns his head toward the sound.
He smiles.
He is about to say something—perhaps her name, perhaps some taunt already waiting on his tongue.
And then—
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>A stab</span>">>
<<goto "Event_Major_EyesInDaytime_KaelReturns">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
The trek back from patrolling the perimeter leaves you coated in a dry layer of grit and sweat. The moon hangs high and heavy, casting silver ribbons through the canopy as you veer off the main path toward the secluded sulfur spring.
The camp is silent behind you, the fires reduced to glowing embers, and you anticipate the rare luxury of washing the grime away in peace. But as you push through the ferns, the sound of splashing reaches your ears, accompanied not by the usual solitary scrubbing, but by soft, rhythmic gasps.
The steam rising from the water parts just enough to reveal two figures familiar to your gaze—women of your tribe. They are oblivious to your arrival, their attention entirely consumed by one another.
One sits on a smooth, mossy stone at the water's edge while the other stands between her parted knees, hands gliding over wet, glistening skin.
<<nsfwimg "images/events/Female_Love/Scene0.gif">>
Their movements are slow, exploratory, and utterly devoid of innocence. Fingers trace the curves of heavy, water-slicked breasts, and mouths find sensitive necks, drawing out whimpers that carry clearly in the night air.
</div>''
<div class="hub-buttons">
<<link "Get a closer look" "Event_Major_Female_Love_Threesome">><</link>>
<<link "Let them have their fun" "Event_Female_Love_Solo">><</link>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
You snap the deliberate quiet, your presence filling the small clearing like a sudden storm. They recoil, stumbling away from each other, faces draining of color.
To them, being caught like this by you is worse than a simple transgression; it is a sacrilege against the living embodiment of their strength. They cower, hands raised in a futile defense, breath hitching in terrified sobs as they await your judgment.
When no strike falls, confusion mixes with the fear. You merely step into the steaming water, letting your eyes rake over them with a heavy, possessive weight. The realization dawns slowly, then all at once: you are not here to smite them. The tension in their shoulders snaps, replaced by a glowing, almost religious relief. They aren't to be cast out; they are to be claimed.
The fear evaporates, transformed instantly into desperate, worshipful need. They scramble toward you, slipping on the slick stones in their haste. No thought is given to their own modesty now, only to the divinity of your form. Eager hands tear at the knots of your loincloth, trembling not from cold but from the sheer honor of being allowed to touch.
<<nsfwimg "images/events/Female_Love/SceneThreesome.gif">>
Your cock springs free, and they fall upon it like starving believers offered a feast, the previous forbidden intimacy forgotten in the overwhelming desire to serve their chieftain.
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
A few days pass.
Monotonously.
Each day follows the same routine. You go to the wildling's tent, hold her down, and help Morag force the poultice down her throat. It is not that you do not understand her resistance. From the smell alone, it is easy to guess that the taste is nothing to savor.
Still, now on the fourth day, things are different.
Though she offers some token resistance, she is far more pliant than before, swallowing most of it without much trouble. And as you hold her, you cannot help but notice that her body no longer burns against yours the way it did before. The fever, it seems, has finally started to break.
When the last of the poultice is gone, Morag gives a satisfied grunt.
"There we go. Was that so hard? And with that, we are done. Within a few days, the spirits should be fully driven out."
She turns to leave, but then pauses and glances back at the two of you, her eyes narrowing slightly as she takes in the position you are in.
"...And no straining physical activity for a few days either, hm? Do not get any ideas. There are already plenty of women in camp willing to answer your call, $user."
She sighs, muttering something under her breath as she leaves the tent.
For your part, you let the wildling girl go.
This time, she rises more slowly, but without the same frantic desperation as before. She looks at you, and where once there had only been hostility, now there is something closer to curiosity.
You look back at her, and silence stretches between you.
Then she makes a few gestures with her hands, followed by a rough sound from her throat. To most, it would likely be incomprehensible.
But you understand the meaning well enough.
"Why help?"
The unspoken question lingers in the air.
You look at her for a moment, then begin to answer in your own tongue, trusting that she can understand your words almost as well as you can understand hers.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Because I did not want you to die</span>">>
<<goto "Event_Major_Fever_Love">>
<</button>>
<<button "<span class='choice-text'>Because you belong to me</span>">>
<<goto "Event_Major_Fever_Obedience">>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<set _wildlingLoveGain = 15>>
<<set $questFlags.q_wildling_fever_done = true>>
<<set $questFlags.q_wildling_fever_queued = false>>
<<run setup.wildHeart.joinWildling({ love: _wildlingLoveGain })>>
<</silently>>''<div class="hub-textbox">
She watches you closely, waiting.
You look at her for a moment, then speak plainly.
"Because I did not want you to die."
For the first time since Morag left, she goes completely still.
You could explain more. Lay out every reason that led you here, every thought that passed through your mind when you chose to help her. But there is no need to complicate something so simple.
Her gaze does not leave your face.
"So I helped."
You spread one hand slightly, as though the answer should be obvious.
The wildling's expression tightens at that, something uncertain passing across it. Suspicion. Confusion. Perhaps even the first faint hint of something else.
You do not press her.
Silence settles between you.
She does not respond, does not gesture, does not try to speak. She simply looks at you.
Then, after what feels like a very long time, she seems to abruptly lose interest. Turning away, she lowers herself onto the furs and lies down with her back to you.
You tilt your head slightly, watching her with a raised brow.
Her face remains turned from you, and yet, even as you continue standing there, she does not seem to mind your presence.
Still, after a while, you let out a quiet sigh and leave the tent, giving her the space to rest.
When the next day comes, however, something interesting becomes apparent.
The hunter assigned to guard her through the night and into the morning bears no fresh wounds, nor does he report any attempt to escape.
A small thing, perhaps.
But one worth remembering.
<div class="result-list">
<div class="result-line good">
<span class="label">New person</span>
<span class="value">The Wildling</span>
</div>
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print _wildlingLoveGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>End Event</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<set _wildlingObedienceGain = 15>>
<<set $questFlags.q_wildling_fever_done = true>>
<<set $questFlags.q_wildling_fever_queued = false>>
<<run setup.wildHeart.joinWildling({ obedience: _wildlingObedienceGain })>>
<</silently>>''<div class="hub-textbox">
She watches you closely, as if weighing whether the answer matters at all.
You hold her gaze for a moment before answering.
You tell her it is because she is in your home now. Your tribe. She eats your food, breathes your air, lives beneath your shelter.
Because she is yours, as much as anything else here is.
Her brow furrows.
You take a slow step closer, not enough to corner her, but enough to make the meaning plain.
For a moment, her eyes harden, and you can almost see the anger flare back to life.
Good.
That, at least, means her strength is returning.
Then she signs again, sharper this time.
"Not yours."
Her glare deepens at once, but you do not think your words fell on deaf ears. They landed somewhere within her, whether she likes it or not. Fertile ground may be too strong a phrase, but one way or another, she will remember what you said.
You do not answer her.
Instead, you turn and leave the tent. There is other work to be done, after all.
<div class="result-list">
<div class="result-line good">
<span class="label">New person</span>
<span class="value">The Wildling</span>
</div>
<div class="result-line good">
<span class="label">Obedience gained</span>
<span class="value">+<<print _wildlingObedienceGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>End Event</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
/* EFFECT: spend 1/3 of stockpiled food, gain big morale (zeal + stability) */
<<set _foodNow = Number($food ?? 0)>>
<<set _spentFood = Math.floor(_foodNow / 3)>>
<<set $food = Math.max(0, _foodNow - _spentFood)>>
<<set $zeal = Number($zeal ?? 0) + 10>>
<<set $stability = Number($stability ?? 0) + 20>>
<</silently>>
''<div class="hub-textbox">
The stores are full—so full that restraint starts to feel like insult.
You make the call.
Fires are fed. Pots are kept boiling. Meat is handed out until hands stop shaking and mouths stop watching every bite. For one night, the camp eats with no worries about what tommorow brings.
The food stores empty out quickly. Its trading a season of assured security for a night of revelarly
<<nsfwimg "images/events/MajorFoodSurpulus/Dance1.gif">>
But the tribe celebrates. And chants your name
A third of what you have- gone into bellies, into laughter, into the kind of warmth that makes people remember why they follow you.
By morning, backs are straighter. Voices carry. Old grudges quiet down, if only because nobody wants to waste breath while the blood still feels rich.
This abundance might not last.
But the feeling will.
<div class="result-list">
<div class="result-line bad">
<span class="label">Spent</span>
<span class="value">-<<print _spentFood>> Food</span>
</div>
<div class="result-line good">
<span class="label">Gained</span>
<span class="value">+10 Zeal, +20 Stability</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "End Event">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
Something in the camp has begun to come undone.
Arguments no longer die with the fire. Oaths are repeated, but heard differently by different ears. Faith divides instead of binding.
People still look to you—
but not all for the same reason, and not with the same trust.
This is not collapse. Not yet.
But it is a split in the bone.
You can speak. Remind them what they are to one another— and what waits outside the ring of light.
Or you can let the tension burn until it becomes its own answer, and accept what it takes with it.
</div>''
<div class="hub-buttons">
<<button "Try to hold them together">>
<<set $frayingChoice = "hold">>
<<goto "Event_Major_FrayingBonds_Resolve">>
<</button>>
<<button "Accept the fracture">>
<<set $frayingChoice = "accept">>
<<goto "Event_Major_FrayingBonds_Resolve">>
<</button>>
</div><<silently>>
<<set _tn = 14>>
<<set _label = "Leadership & Charisma">>
<<set _roll = random(1,20)>>
<<set _stat = Number($leadership ?? 0) + Number($charisma ?? 0)>>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _tn)>>
<</silently>>
''<div class="hub-textbox">
<<if $frayingChoice is "accept">>
You do not intervene.
<br><br>
You let the words spill and sour. You let the looks linger. You let small insults become habits.
<br><br>
The camp reorganizes itself without asking you.
<br><br>
Families close ranks. Friends become “ours” and “theirs.” Work still gets done—but now it is counted, weighed, remembered. A shared fire becomes a borrowed one.
<br><br>
Nobody riots. Nobody leaves in the night. But the tribe stops being one thing.
<br><br>
The ring of firelight still holds back the dark— yet inside it, people begin to watch each other as if the dark might be wearing familiar faces.
<br><br>
<div class="result-list">
<div class="result-line bad">
<span class="label">Choice</span>
<span class="value">Accept the fracture</span>
</div>
<div class="result-line bad">
<span class="label">End</span>
<span class="value">-1 Stability, -30 Resources</span>
</div>
</div>
<<else>>
<div class="result-list">
<<if _success>>
<div class="result-line good">
<span class="label">Speech</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Speech</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print _label>> + d20 vs TN</span>
<span class="value"><<print _total>> / <<print _tn>></span>
</div>
</div>
<br>
You step in—three paces, no more—close enough that everyone has to either meet your eyes or look away.
<br><br>
Not with a threat—threats are cheap, and everyone here has teeth.
<br><br>
You speak like you speak to a storm: steady, unblinking, naming what is true.
<br><br>
You remind them of the nights when hunger made beasts of men. You remind them who carried the wounded *to this very fire*. You remind them the world outside the light doesn’t care who was right in an argument.
<br><br>
You do not ask for love.
<br>
You demand function.
<br><br>
<<if _success>>
Your words do not heal the fracture.
<br><br>
But they stop it from splitting wide.
<br><br>
Someone looks away first. A jaw unclenches. A hand eases off a spearshaft. The loudest mouths quiet down—not out of shame, but because your voice has become the heaviest thing in arm’s reach.
<br><br>
People return to their tasks with less poison in their breath.
<br>
The fire holds a little longer.
<<else>>
Your words land wrong.
<br><br>
Some hear weakness and smell opportunity. Others hear accusation and feel pride flare hot.
<br><br>
Voices rise instead of settling—right there, right on top of you.
<br>
What was tension becomes personal—names spoken, old wrongs dragged up like bones.
<br><br>
Someone spits into the dirt a step from your boots. Someone else laughs—sharp and ugly.
<br><br>
For the first time in a long while, the tribe does not move as one body.
<br><br>
They break into corners, and the corners start to harden.
<</if>>
<br><br>
<div class="result-list">
<<if _success>>
<div class="result-line good">
<span class="label">Effect</span>
<span class="value">+1 Stability</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">End</span>
<span class="value">-3 Stability, -3 Zeal, -2 Resources</span>
</div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "End Event">>
<<if $frayingChoice is "accept">>
<<set $stability = Number($stability ?? 0) - 1>>
<<set $resources = Math.max(0, Number($resources ?? 0) - 30)>>
<<else>>
<<if _success>>
<<set $stability = Number($stability ?? 0) + 1>>
<<else>>
<<set $stability = Number($stability ?? 0) - 3>>
<<set $zeal = Number($zeal ?? 0) - 3>>
<<set $resources = Math.max(0, Number($resources ?? 0) - 2)>>
<</if>>
<</if>>
<<unset $frayingChoice>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run setup.playStars ? setup.playStars() : (function () {
try {
if (setup.stopAllAudio) setup.stopAllAudio();
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr) {
tr.loop(true);
tr.volume((setup.audio && setup.audio.getMusicVolume01) ? setup.audio.getMusicVolume01() : ((settings.masterVolume ?? 10) / 10));
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
}
if (State && State.variables) {
State.variables.musicState = State.variables.musicState || { playing:false, track:"", source:"" };
State.variables.musicState.playing = true;
State.variables.musicState.track = "stars";
State.variables.musicState.source = "scene";
State.variables.introActive = false;
State.variables.mainThemeActive = false;
State.variables.battleActive = false;
}
} catch (e) {}
})()>>
<<npcAlive "npc_outcast_brother">>
<</silently>>
''<div class="hub-textbox">
It’s late at night, and you find yourself not quite ready to turn in. So, instead, you decide to take a walk around the camp.
As you pass between the tents and fires, you spot Aedan, Kael’s eldest, leading a group of younger boys in a mock hunt, all loud whispers and exaggerated crouches. Nearby, their mothers watch with faint smiles, talking among themselves as they keep half an eye on the game.
<<if _npcAlive>>
You also notice that Tiksi, for his part, seems to have started acclimating. You can’t quite make out what he says, but a few of the men still awake seem amused by it, judging by the low chuckles that follow.
His sister, however, doesn’t seem to be anywhere in sight.
<</if>>
In the end, your steps carry you toward Halona’s tent, the exact reason why known only to you.
To your surprise, it stands empty.
Your curiosity stirred—and with nothing better to do—you decide to look for her.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Look for Halona</span>">>
<<goto "Event_Major_HeartToHeart_Search">>
<</button>>
</div>''<div class="hub-textbox">
You remain where you are for a moment, watching her beneath the stars.
Then, instead of sitting, you give a small shake of your head.
Halona studies you for a second, saying nothing. Whatever she reads in the gesture, she accepts it quickly enough. The faint softness that had touched her expression fades, though not entirely. What remains is quieter. More guarded.
“I see,” she says.
There is no anger in it. Only a note of disappointment she does not bother to hide all that well.
Her gaze drifts back upward, toward the countless lights overhead.
“They will still be there tomorrow,” she murmurs. “Assuming either of us cares to look.”
For a moment longer, you stand there in silence.
Then you turn back toward camp.
You can feel her eyes on your back for the first few steps, though when you glance over your shoulder, she is already looking skyward again—alone beneath the stars, with no one left to name them to.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<run (function () {
try {
if (setup.stopAllAudio) {
setup.stopAllAudio();
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr) tr.stop();
}
if (State && State.variables && State.variables.musicState) {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
It doesn’t take you long to realize that, for all your looking, the woman is nowhere to be found within the camp.
So you widen your search.
You pass beyond the camp’s perimeter and out into the quiet beyond. Out here, the sounds of the camp fall away, leaving only the hush of the night.
<<if $terrain is "forest">>
[Small descriptive text of the trees, earth, and distant animal sounds.]
<<elseif $terrain is "lake">>
[Small descriptive text of the water, damp ground, and the occasional ripple or call from the shore.]
<<elseif $terrain is "river">>
[Small descriptive text of the current, the wet stones, and reeds shifting in the dark.]
<<elseif $terrain is "mountain">>
[Small descriptive text of the cold air, stone underfoot, and the stillness of higher ground.]
<</if>>
After a while, you finally notice something in the distance.
A lone woman.
Beautiful. Familiar.
Halona sits on the ground with her knees drawn close, her gaze fixed somewhere far beyond the dark horizon—on something neither your eyes nor, perhaps, even hers can truly reach. On a home she can no longer return to.
You approach her slowly from behind.
She does not stir. Gives no sign that she has heard you.
And yet—
“Trouble sleeping, $user?”
Your brow lifts.
She recognized you without turning, without so much as a glance. Before you can ask how, she goes on, her voice quieter than usual, touched by a somberness you rarely hear from her.
She raises one hand and points toward the sky, toward the countless small lights scattered across it.
“Timen,” she says. “Stars.”
Her eyes stay on them.
“My people say they were there for our forefathers, and will still be there long after our grandchildren are gone. Guiding them through the darkness when they are lost. Leading them when they cannot find their own way.”
For a moment she says nothing more.
Then, softer:
“Beautiful things, aren’t they?”
Only then does she shift, lowering her head slightly onto her knees before turning to look at you.
<img src="images/events/hearttoheart/stars.png" alt="Amogus">
“What do you think, $user?”
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>The stars are beautiful</span>">>
<<goto "Event_Major_HeartToHeart_StarsBeautiful">>
<</button>>
<<button "<span class='choice-text'>The stars are only lights</span>">>
<<goto "Event_Major_HeartToHeart_StarsOnlyLights">>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["heart_to_heart_done"] = true>>
<<set $questFlags["heart_to_heart_outcome"] = "silent">>
<<set _removeIds = ["npc_outcast","npc_outcast_brother"]>>
<<if $campNpcs and $campNpcs.length>>
<<set $campNpcs = $campNpcs.filter(n => n && _removeIds.indexOf(String(n.id ?? "")) === -1)>>
<</if>>
<<if $people and $people.length>>
<<set $people = $people.filter(p => p && _removeIds.indexOf(String(p.id ?? "")) === -1)>>
<</if>>
<<if _removeIds.indexOf(String($activePersonId ?? "")) >= 0>><<set $activePersonId = null>><</if>>
<<if _removeIds.indexOf(String($selectedPersonId ?? "")) >= 0>><<set $selectedPersonId = null>><</if>>
<<if _removeIds.indexOf(String($personSelectedId ?? "")) >= 0>><<set $personSelectedId = null>><</if>>
<<if _removeIds.indexOf(String($personInfoId ?? "")) >= 0>><<set $personInfoId = null>><</if>>
<<for _i = 0; _i < _removeIds.length; _i++>>
<<set _pid = String(_removeIds[_i])>>
<<run (State.variables.npcTalkMenu && _pid) ? (delete State.variables.npcTalkMenu[_pid]) : 0>>
<<run (State.variables.npcTalks && _pid) ? (delete State.variables.npcTalks[_pid]) : 0>>
<</for>>
<</silently>>
''<div class="hub-textbox">
You say nothing.
For a moment, you simply hold her gaze.
Then your hand loosens around hers.
It is not a rejection. Not quite. But neither is it a plea for her to stay.
Halona watches your face for a long moment, as if searching it for something more—some firmer answer, some last sign that she ought to ignore what she just offered and remain anyway.
Whatever she finds there, it is not enough.
Something in her expression hardens, though not with anger. More like resignation. A quiet kind of hurt she refuses to let grow teeth.
Slowly, she withdraws her hand from yours and lowers her eyes.
“I see,” she says.
Her voice is steady again. Too steady.
<<if _npcAlive>>
“Then my brother and I will be gone by morning. It is better that way.”
<<else>>
“Then I will be gone by morning. It is better that way.”
<</if>>
She looks back out into the dark, toward the lake and the home that cast her out.
“You have already done more than most would have. I will not ask for more.”
The night stretches quiet between you.
After a while, she draws in a slow breath and folds her arms over her knees once more, making herself smaller, more distant.
“You should get some rest, $user.”
This time, there is nothing uncertain in it.
So, after one last look at her, you rise and leave her beneath the stars—alone with the dark, and with the choice you did not make.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<run (function () {
try {
if (setup.stopAllAudio) {
setup.stopAllAudio();
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr) tr.stop();
}
if (State && State.variables && State.variables.musicState) {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div><<silently>><<npcAlive "npc_outcast_brother">><</silently>>
''<div class="hub-textbox">
You oblige, sitting down beside her.
She tries not to show it, but the small smile that touches her lips is enough to tell you she is pleased you indulged her.
For the next hour or so, she speaks of the stars. She points out constellations, explains their meanings, and tells you how their alignments are read against the spirits. In time, you even coax her into speaking of her past.
She tells you of her grandmother, of her father, and of a time when, as a child, she swore she had spotted a spirit among the reeds by the lake—only for her grandmother to march over with a torch and reveal the “spirit” to be a half-drowned fisherman who had passed out face-first in the mud after too much drink. The memory earns the faintest huff of laughter from her, and when you answer with a joke of your own, you even manage to draw a real one from her.
But the laughter fades.
Silence follows, and from that silence the mood turns more subdued.
“...I suppose you’re curious,” she says at last. “About the life my brother and I led. About where we came from.”
Without waiting for your answer, she lifts a hand and points out across the dark, toward the same distant stretch she had been watching when you first found her.
“Mishan—the city on the lake. Have you passed by it while moving camp?”
She asks the question, but does not seem to care whether you answer.
“It was my brother’s home. Mine too. My father was its chief, and by right of assembly, my brother was meant to succeed him after his death.”
Her hand lowers slowly. You notice her fingers curl in against her palm.
“But a viper hiding its fangs cast us out of our own nest.”
The contempt in her voice is unmistakable now.
“Kavonok calls himself chieftain now. He rules there as both lord and usurper—a man more interested in killing and pillaging than ruling.”
She exhales, unclenching her fist, then turns her eyes up toward you.
“I am not telling you this because I want revenge done in my name. Or in my brother’s.” She pauses. “I am telling you because you should know what kind of man lives by that lake.”
Her hand tightens slightly where it rests against yours.
“If you continue to call these lands home, it is only a matter of time before he takes notice.” Her voice grows quieter. “And sooner still if he learns you are sheltering us.”
For a moment she says nothing.
Then, with a firmness that sounds almost rehearsed, she adds:
<<if _npcAlive>>
“If you want, my brother and I will leave tomorrow. We have already brought enough danger to the people who helped us.”
<<else>>
“If you want, I will leave tomorrow. I have already brought enough danger to the people who helped me.”
<</if>>
Her grip tightens once more.
“To you.”
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Urge her to stay</span>">>
<<goto "Event_Major_HeartToHeart_UrgeStay">>
<</button>>
<<button "<span class='choice-text'>Say nothing</span>">>
<<goto "Event_Major_HeartToHeart_Silent">>
<</button>>
</div>''<div class="hub-textbox">
You nod and agree with her. Indeed, the stars serve a noble purpose. To guide those who would otherwise be left blind in the dark—made only grander by the beauty of their light. Could there be a finer purpose?
She listens to your answer, her dark eyes fixed on you as she turns your words over in her mind.
“And what becomes of those who never learn to walk without them?” she asks at last. “A guiding light is a fine thing. But if people grow too used to following it, they forget how to find their own way.”
After a moment of silence, she adds,
“...I always thought they looked lonely.”
Then, after another stretch of quiet, she finally rises and looks at you again. With a small motion of her hand, she taps the ground beside her.
“Sit with me, $user. Whatever you think of the stars, they are still worth knowing.”
Her gaze flicks upward again.
“Let me show you the alignments my grandmother taught me.”
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Sit with her</span>">>
<<goto "Event_Major_HeartToHeart_Sit">>
<</button>>
<<button "<span class='choice-text'>Go back to camp</span>">>
<<goto "Event_Major_HeartToHeart_GoBack">>
<</button>>
</div>''<div class="hub-textbox">
You disagree with her. True, the stars cast light enough to guide those beneath them, but that does not make guidance their purpose. They shine for reasons of their own. That men happen to find their way by them is only an aftereffect.
She listens to your answer, her dark eyes boring into you as she digests what you’ve said.
“So you think the lights in the sky shine only because they were made to shine?” she asks. “That would be a sad thing, if it were true.”
She turns her gaze back to the sky.
After a moment of silence, she adds,
“...I always thought they looked lonely.”
Then, after another stretch of quiet, she finally rises and looks at you again. With a small motion of her hand, she taps the ground beside her.
“Sit with me, $user. Whatever you think of the stars, they are still worth knowing.”
Her gaze flicks upward again.
“Let me show you the alignments my grandmother taught me.”
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Sit with her</span>">>
<<goto "Event_Major_HeartToHeart_Sit">>
<</button>>
<<button "<span class='choice-text'>Go back to camp</span>">>
<<goto "Event_Major_HeartToHeart_GoBack">>
<</button>>
</div>''<div class="hub-textbox">
The moonlight turns Halona’s skin into pale marble. She pulls you down, her hands shaking where they grip your shoulders, and kisses you again. It is soft this time, her lips parting easily to let you in, tasting of mint and night air.
"I still think you're an idiot," she whispers against your mouth, but she is smiling just a little.
She lies back in the tall grass, the silver blades bending around her body like a cage. She pulls her tunic up, exposing herself to the cool night wind. Her stomach tenses at the chill, flushing pink. Her legs part slowly, an offering.
"Come here."
You settle over her, the heat of your body chasing away the goosebumps on her arms. You reach down, thumbs hooking into the waist of her leggings to drag them down. She lifts her hips to help, kicking them away. Her cunt is bare to you, a small, tight slit glistening with wetness, hidden under a dark patch of hair.
She gasps as you touch her, her back arching off the ground. "It's... different when you touch me."
You line your cock up with her entrance. The head pushes against her folds, spreading them. She is impossibly small, the hole barely a bud that resists your intrusion.
"Wait," she breathes, her hands flying to your forearms. Her eyes seek yours, wide and dark in the pale light. "Just... go slow."
You push forward. The resistance is immediate and absolute. Her body fights you, muscles clamping down in panic. You feel the barrier of her hymen, a thin wall of tissue blocking the way.
She bites her lip, a small whimper escaping her throat. "Don't stop. I want this. I want you."
<<nsfwimg "images/events/hearttoheart/sex.webp">>
You press harder. The tissue stretches, taut and stinging, before it tears. A sharp cry tears from her throat, and she digs her nails into your skin, drawing blood. You slide in an inch, the sudden heat gripping you like a burning fist.
"Gods," she gasps, her head thrown back. "You're... you're splitting me open."
You still, giving her time to adjust. The pulse of her heart beats against your shaft where you are buried inside her. She feels like liquid fire, scorching hot and incredibly tight. Sweat beads on her forehead.
"Move," she says after a moment, her voice strained. "Please. I want to feel all of you."
You sink deeper, burying yourself to the hilt in one slow, relentless thrust. She cries out again, the sound raw and unguarded, but this time she rocks her hips up to meet you, accepting the pain as the price of this connection.
You begin to move. There is no rush. You pull out until only the head remains inside her, then push back in, dragging a moan from her lips. Every stroke sends a fresh wave of sensation through her body, making her toes curl in the grass.
She wraps her legs around your waist, pulling you tight against her. She stares up at you, her eyes glassy with tears of pain and pleasure, completely focused on your face.
"Don't look away," she commands softly.
She lifts her head to kiss you, sloppy and wet, her tongue tangling with yours. You can taste the salt of her tears. Her inner walls ripple around your cock, squeezing you rhythmically, massaging your length as you take her.
The friction builds, a slow burn that starts in your groin and spreads outward. Her cunt is swollen and sensitive, every ridge and vein of your cock rubbing against her untouched places.
"I can feel... it," she whimpers, breaking the kiss to gasp for air. "Something is happening."
Her body seizes up. Her thighs clamp around your ribs, trapping you. Her pussy convulses violently, a series of hard, clamping spasms that milk your shaft. She screams, her nails raking down your back, as her orgasm crashes over her.
The sensation is too much. You groan, burying your face in her neck, and let go. Your cock pulses, thick streams of cum filling her up. You pump her full of your seed, the heat of it mixing with her own fluids.
She shudders beneath you, her body relaxing bonelessly into the grass. You stay inside her, softening but still connected, neither of you willing to break the seal. The wind rustles the grass around you, cooling the sweat on your skin.
She strokes your hair, her fingers gentle.
"I meant it," she whispers into the darkness. "I hate that I care."
She says it into the dark, so quietly that for a moment it almost feels like something meant only for herself.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_HeartToHeart_TumbleEnd">>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["heart_to_heart_done"] = true>>
<<set $questFlags["heart_to_heart_outcome"] = "stay">>
<<run (function () {
const V = SugarCube.State.variables;
const h = setup.people.upsert("npc_outcast", {});
h.love = Number(h.love ?? 0) + 15;
V.halonaLoveGain = 15;
})();>>
<</silently>>
''<div class="hub-textbox">
You lift your head and look at her.
The moon catches in her eyes, in the damp lashes, in the loose strands of black hair stuck to her cheeks. She looks exhausted. Softened, in a way you have never seen from her before. But when she notices you watching, some small remnant of defiance returns to her mouth.
“Don’t look so pleased with yourself,” she murmurs, though there is no strength in it.
You shift, easing your weight off her at last, and the night air rushes cool against sweat-warmed skin. For a moment neither of you moves. The grass whispers around you. Somewhere in the dark, an insect chirrs. The camp beyond feels far away.
Then Halona tries to sit up.
She makes it halfway before a sharp breath catches in her throat and her hand shoots to your arm.
You say nothing. You simply slide one arm beneath her back and the other under her legs, and lift her from the grass.
She stiffens at once.
“I can walk,” she mutters.
Maybe she even believes it.
Still, she does not fight you.
She only folds in closer after a moment, one hand clutching at your shoulder while the other gathers her tunic around herself. Her face turns slightly into your neck, whether to hide the flush still lingering there or simply to avoid your eyes, you cannot tell.
You carry her back in silence.
The camp is quieter now, most fires burned low, most voices long gone. By the time you reach her tent, her grip on you has loosened. Sleep pulls at her in spite of herself.
When you lower her gently onto her bedding, she catches your wrist before you can pull away.
Her eyes open just enough to find yours.
“You are still an arrogant fool,” she whispers.
Then, after the smallest pause:
“But stay. Just until I fall asleep.”
And stay you do.
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print $halonaLoveGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<run (function () {
try {
if (setup.stopAllAudio) {
setup.stopAllAudio();
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr) tr.stop();
}
if (State && State.variables && State.variables.musicState) {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
You say nothing at first. You simply look at her.
Then you shift where you sit and take her firmly by the shoulders, turning her toward you. Your $eyes eyes meet hers, unblinking.
For a moment, you still say nothing.
Then, at last, you give her something simple. Something firm.
“Stay.”
You tell her that you are powerful. That you are wise. That you are capable of things other men can scarcely imagine. You tell her she is safe with you. That her place is here.
She listens in silence. Whatever your words stir in her, she tries to hide it by turning her head aside, breaking eye contact—perhaps hoping to hide the faint wetness gathering in her eyes.
“You are an arrogant fool.”
<<if $height < 160>>
“And a short, stubborn one.”
<<elseif $height > 190>>
“And a great lumbering oaf on top of it.”
<<else>>
“And a stubborn one, besides.”
<</if>>
Then, suddenly, she looks back at you.
And before you can say anything else, she presses her lips against yours.
When she finally breaks the kiss, she is a little breathless.
“And I hate that I care for you.”
Then she kisses you again.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return her kiss</span>">>
<<goto "Event_Major_HeartToHeart_Tumble">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
The sun bleeds out over the horizon as you make your way back to the flickering fires of the camp, a brace of rabbits slung over your shoulder. Your mind is on the warmth of the hearth and the promise of a hot meal, but something on the path ahead gives you pause.
It's not the familiar, heavy print of your tribe's hunters, nor the broad, splayed tracks of the foragers. These are lighter, smaller, and strangely numerous.
They are barefoot, but the impressions are shallow, made by people who move with a hesitant, shuffling gait, as if carrying precious things with unfamiliar care. They lead away from the path, disappearing into the deepening shadows of the woods.
</div>''
<div class="hub-buttons">
<<link "Follow the strange tracks (Wisdom check)" "Event_SmallTracks_Investigate">><</link>>
<<link "Shrug it off. The wilds are full of mysteries.">>
<<endMajorEvent>>
<</link>>
</div>''<div class="hub-textbox">
It’s been a while since you went out to hunt alone. But now—now the tribe feels secure in the new region, the camp finally settled and steady—you allow yourself the indulgence.
Not as a duty. Not as a necessity.
A test.
You leave before the others wake, slipping into the trees with only your spear and your thoughts. The forest accepts you the way it always has: cold air, damp earth, the hush of distant life. And as you move deeper, you can’t help but notice it again—
Something about you isn’t… normal.
<<silently>>
/* Fix spelling + ensure numeric compares */
<<set _str = Number($strength ?? 0)>>
<<set _wis = Number($wisdom ?? 0)>>
/* If equal, randomly pick which "feel" you get */
<<set _huntRoll = 0>>
<<if _str is _wis>>
<<set _huntRoll = random(1,2)>>
<</if>>
<</silently>>
<<if (_str > _wis) or ((_str is _wis) and (_huntRoll is 1))>>
And, yet again—like always—you feel ''wrongly'' capable.
Faster. Stronger. Lighter on your feet.
The undergrowth that should snag you parts without protest. The ground that should slow you never does. Animals catch your scent and flee, but it doesn’t matter—nothing escapes you. You run them down with a predator’s certainty, weaving through trunks and brush with a grace that feels almost insulting.
A boar finally breaks from the thicket ahead—big, thick-necked, mean. It charges, and you meet it without hesitation.
Your spear drives forward.
The point sinks into its skull as if you’d thrust it into soft clay—no resistance, no fight, just a brutal, clean passage. The boar collapses instantly.
And then the spear ''snaps''.
Not because the animal resisted… but because your grip did. Because the force you put into it was too much for stone and wood to survive.
You stare at the broken shaft in your hands. Slowly, you let the useless half fall. Your fingers ache, but not from strain—from the strange reminder that you’re holding back without even meaning to.
You flex your hand once, watching the tendons shift beneath your skin, and whatever thought crosses your mind stays locked behind your eyes.
<<else>>
And, yet again—you feel ''sharper'' than you did even yesterday.
Not stronger. Not faster.
Just… more aware.
The forest speaks in details most men never notice: a bent blade of grass, a scuffed patch of soil, the faint smear of mud on bark. Tracks that even experienced hunters would miss stand out to you like carved signs. What looks like random animal wandering becomes pattern. Purpose. A story.
It doesn’t take long before that story points to a boar.
A large one.
The kind that ends hunts early—with a tusk through the thigh, a scream cut short, a body dragged into the brush for wolves to argue over. You find the churned earth where it has been rooting, the deep prints where it turned, the broken stems where it pushed through.
And then you find ''it''.
It snorts and paws the ground, thick muscles tensing beneath bristled hide, eyes dull with instinct and aggression. A mindless brute of meat and momentum—deadly only because it never doubts itself.
You don’t flinch.
You plant your feet and wait.
The boar charges.
At the last moment you step aside—just a fraction—letting its own speed betray it. Your spear comes up not as a contest of strength, but as an answer to a question you already solved. The point slips in under the jawline, where the armor of bone and muscle gives way.
One clean thrust.
The boar’s body crashes past you, stumbles, and collapses hard enough to shake leaves from a nearby branch. It kicks once. Twice. Then nothing.
You stand over it, breathing steady, barely warmed by the effort—like you simply ''allowed'' the boar to die.
<</if>>
Afterward, you take your time. You clean the worst of the blood from your hands and arms, wiping it into moss and wet grass until the red becomes only a stain.
Then—casual, almost bored—you hook your arms beneath the boar’s weight and haul it up onto your shoulder.
It should be heavy. It ''is'' heavy.
And yet it feels like nothing.
You turn back toward camp, already thinking about what this will mean for the tribe—meat, fat, hide, bones—your mind drifting ahead of your feet.
That’s when you step into something.
It isn’t mud.
It isn’t water.
It’s a ''line''—tight around your ankle for half a heartbeat—followed by a sharp mechanical pull that the wilderness has no right to possess.
The ground shifts.
The brush ahead trembles.
And you hear it—the faint, hateful ''click'' of something waiting to be triggered.
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Its a trap!</span>">>
<<goto "Event_Major_ItsATrap_1">>
<</link>>
</div><<silently>>
/* Numeric-safe */
<<set _end = Number($endurance ?? 0)>>
<<set _hasSpark = !!($powersOwned and $powersOwned.spark)>>
<</silently>>
''<div class="hub-textbox">
The snare tightens with a clever jerk, cords biting into your ankle as weight and leverage do the rest. For a brief moment you can almost appreciate it.
It’s… intricate, to be sure.
But against someone like you?
The trap’s “teeth” scrape more pride than flesh.
<<if _end < 5>>
It leaves a shallow wound—warm blood beading, then slowing almost immediately. Annoying. Nothing more. It will heal quickly.
<<else>>
It leaves only a scratch.
If even that.
<</if>>
Either way, you don’t panic. You don’t thrash. You simply ''move''—hands finding the knots, the tension points, the hidden pin that holds the whole thing together. With two quick motions you break the mechanism’s bite and step free, as if you’d slipped out of a boot.
Then you go still.
And you listen.
At first there’s nothing but wind in branches and the distant hush of birds. But your eyes keep drifting toward the same patch of brush, the same shape that doesn’t quite match the rest of the forest.
It takes you a moment.
They’re hidden well.
Very well.
A hunter.
You let your posture loosen. You breathe a little slower. You even allow your gaze to drift away—deliberately, as if you’ve already lost interest. As if you never noticed a thing.
And then you act.
<<if _hasSpark>>
A thin white flame blooms in your palm—small, controlled, almost delicate. You flick it toward the brush like you’re tossing a pebble.
The bush flashes with pale light.
A heartbeat later, the culprit bursts out, half-stumbling, half-leaping—frantic hands slapping at their clothes, patting at their skin, checking again and again to make sure they haven’t caught fire.
<<else>>
You crouch, slow and casual, as if the trap itself is the only thing that interests you. You tilt your head. You prod one of the cords with a fingertip. You look, for all the world, like a man admiring craftsmanship.
Then you pick up a stone.
Your arm moves once—barely a throw, more a careless flick.
The stone ''whips'' through the air with a speed that doesn’t belong to casualness. It smashes into the tree beside the bush with a heavy ''thunk'', biting deep enough to leave a fresh indent in the bark—then ricochets, tearing through leaves and snapping twigs as it vanishes into the brush.
Something inside the bush is struck.
A sharp intake of breath—almost a hiss.
And then the culprit jumps out.
<</if>>
<img src="images/events/ItsATrap/Wildling.png" alt="Amogus">
…Yet to your surprise, it’s a woman.
Filth and grime streak her skin, clinging to her like a second skin, but it can’t fully drown what’s beneath it—natural beauty, hard lines, sharp eyes. A contradiction that’s almost amusing: feral savagery wearing the shape of something finer.
She stays low, half-crouched, ready to spring like a wounded wolf deciding whether to flee or fight. There’s no pride in her stance—only the raw, animal math of survival.
She makes the sound again, somewhere between a hiss and a growl.
It isn’t language. Not quite.
And yet some deep part of your brain understands it anyway.
''Don’t come closer. Don’t try me. I will bite.''
Even without that instinct, her meaning is clear.
The question is… what will you do?
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Attack her</span>">>
<<goto "ItsATrap_Attack">>
<</link>>
<<link "<span class='choice-num'>2</span><span class='choice-text'>Calm her</span>">>
<<goto "ItsATrap_Calm">>
<</link>>
</div>''<div class="hub-textbox">
He does not answer at once.
His gaze remains fixed on the distance for a few moments longer. At last, he exhales.
“It’s nothing.”
He says it in his usual even tone.
Then, after a pause:
“No. That would be a lie.”
Only then does he turn to face you.
“I can’t stop thinking about that tribe by the lake—the one those displaced hunters spoke of.”
His eyes hold yours for a moment, then drift back toward the horizon.
“If it were only that, I wouldn’t be troubled. Small tribes are swallowed by larger, stronger ones all the time. That is the way of things.”
His expression does not change.
“But the way their old chieftain spoke of them...” He trails off for a moment. “It did not sound like some passing raid. It sounded common. Expected. As though they claimed the whole region and called it theirs by right. Pushing all others out”
He folds his arms.
“That is what troubles me.”
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Any plans?</span>">>
<<goto "Event_Major_KaelScout_Plans">>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["kael_scout_departed"] = true>>
<<set _pid = "npc_kael">>
/* Remove from CAMP NPC list */
<<if $campNpcs and $campNpcs.length>>
<<set $campNpcs = $campNpcs.filter(n => n and n.id !== _pid)>>
<</if>>
/* Remove from generic people list */
<<if $people and $people.length>>
<<set $people = $people.filter(p => p and p.id !== _pid)>>
<</if>>
/* Clear selection only if it points to him */
<<if $activePersonId is _pid>><<set $activePersonId = null>><</if>>
<<if $selectedPersonId is _pid>><<set $selectedPersonId = null>><</if>>
<<if $personSelectedId is _pid>><<set $personSelectedId = null>><</if>>
<<if $personInfoId is _pid>><<set $personInfoId = null>><</if>>
/* Clear talk/menu state safely */
<<run (State.variables.npcTalkMenu && _pid) ? (delete State.variables.npcTalkMenu[_pid]) : 0>>
<<run (State.variables.npcTalks && _pid) ? (delete State.variables.npcTalks[_pid]) : 0>>
<</silently>>
''<div class="hub-textbox">
At your nod, he lets out a small, barely perceptible sigh.
For a moment, his gaze shifts toward Aedan. The boy is helping the women alongside the other children, trying very hard to look useful.
Then Kael looks back to you.
“Well then. I’ll go see to the preparations, Chieftain.”
He turns to leave, but stops after only a step or two.
When he speaks again, it is with a note so slight you might have missed it, had you known him any less.
“Take care of yourself, $user. Alright?”
Then he walks off.
You watch him go for a moment longer before finally turning away yourself.
There is translation work waiting for you, after all.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
He nods almost immediately, then turns to look at you.
“A simple one. I’ll gather some men, then…”
He tips his head slightly in the direction of Halona’s tent.
“Go speak with the outcast girl. Get what directions I can...or rather,” he adds, glancing back at you, “have you do it for me, if you don’t mind chieftain. She seems quick enough, but neither of us has quite managed to get past the language barrier yet.”
His gaze drifts back toward the distance.
“Then the men and I will go and have a look at our neighbors.”
A brief pause.
“From a distance, for now.”
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Nod</span>">>
<<goto "Event_Major_KaelScout_Departure">>
<</button>>
</div><<silently>>
/* ===========================
Major Event: The Moving Mountain - Updates quest text - Creates an expedition ON the current camp tile =========================== */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_moving_hill_01">>
/* Find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Update quest + pin expedition to CURRENT camp tile */
<<if _qIndex >= 0>>
<<set $quests[_qIndex].name = "The Moving Mountain">>
<<set $quests[_qIndex].desc = "After relocating the camp, you spotted it in the distance—an unnaturally smooth hill with even proportions, blanketed in grass. The same shape Rutvig described. If it truly moves, this may be the only chance to reach it.">>
<<set $quests[_qIndex].objective = "Use Expedition at your current camp to send a party toward the ‘moving mountain.’">>
/* Expedition is from the current camp tile */
<<set $quests[_qIndex].targetX = $campX>>
<<set $quests[_qIndex].targetY = $campY>>
<<set $quests[_qIndex].expeditionPassage = "Quest_MovingHill_02">>
/* Show the expedition button at camp */
<<set $quests[_qIndex].markerRevealed = true>>
<<set $quests[_qIndex].status = "active">>
<</if>>
/* Consume the relocation-wait flag so it doesn't re-arm */
<<set $questFlags["q_moving_hill_01_waitRelocate"] = false>>
/* Optional: highlight it */
<<set $trackedQuestId = _qid>>
<</silently>>
''<div class="hub-textbox">
It’s been a long trek, but you’ve finally found a good location for your tribe to set up camp…
<br><br>
As the work around camp continues, whether from boredom or simple vigilance, your eyes begin to wander…
<br><br>
And then you see it.
<br><br>
To most, at this distance, it would look like a normal hill—maybe even a small mountain.
But your eyes know better.
<br><br>
As you stare at its unnaturally even edges, and the grass that blankets its surface, you can’t help but recall the moving mountain you went searching for a few seasons ago.
<br><br>
Perhaps it’s time to send out another search party.
<br><br>
<div class="result-list">
<div class="result-line good">
<span class="label">Task updated</span>
<span class="value">A new lead: the moving mountain</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run setup.finishNostalgiaEntryTransition()>>
<<run setup.stopAllAudio ? setup.stopAllAudio() : null>>
<<run setup.playIntro()>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<<set _artifactName = _ev?.data?.sourceArtifactName ?? "memory artifact">>
<<set _memoryHits = Number(_ev?.data?.normalHits ?? 0)>>
<</silently>>
''<div class="intro-creation intro-start-form no-click-sfx nostalgia-opening-fade">
<p>
Sleep comes in fragments. Your body twitches, squirms, refuses you. You reach for something, though you do not know what, and the harder you strain for it the more trapped you feel. Like a prisoner in your own flesh.
</p>
<<if _memoryHits > 0>>
<p>
This is not the first time sleep has come like this. The dreamless nights. The sudden weight behind your eyes. The strange loops of recognition that vanish the moment you try to seize them. They were leading somewhere. Here.
</p>
<</if>>
<p>
The <<print _artifactName>> feels hot enough to burn, though it is not even touching you. Something in you tries to speak. The words are there, right there, caught at your lips, but your body will not obey.
</p>
<p>
With a sharp effort, you force yourself upright—
but your eyes do not open.
</p>
<p>
Still, you see.
</p>
<p>
Not with eyes. Not with anything made of flesh.
</p>
<p>
This place is familiar. Not like a face or a voice is familiar. Something known too deeply to ever be truly forgotten, even when memory slips away from it.
</p>
<p>
This place is familiar. The only place you remember, and the first place you forget.
</p>
<p>
Nothingness. A void without form or substance.
</p>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Try to remember</span>">>
<<goto "Event_Major_Nostalgia_1">>
<</button>>
</div><<silently>>
<<run setup.playIntro()>>
<<set _fakeHair = setup.getNostalgiaCorruption("hair", $hair || "White")>>
<<set _fakeEyes = setup.getNostalgiaCorruption("eyes", $eyes || "Green")>>
<<set _fakeSkin = setup.getNostalgiaCorruption("skin", $skin || "Olive")>>
<<set _fakeHeight = setup.maskNostalgiaHeight($height || 201)>>
<<set _fakeName = "lIlIl">>
<</silently>>
<div class="intro-creation intro-start-form no-click-sfx nostalgia-fake-start">
You exist in nothingness. A void without form or substance, yet here you are—conscious.
Your hair, you recall, was <<listbox "_fakeHair" autoselect>>
<<option "Bl*nd#">>
<<option "W*it#">>
<<option "Br*wn">>
<<option "Gi#g#r">>
<</listbox>>—a beautiful colour.
Your eyes, <<listbox "_fakeEyes" autoselect>>
<<option "Bl*e">>
<<option "R*d">>
<<option "Gr*e#">>
<<option "Br*wn">>
<</listbox>>.
You remember standing <<textbox "_fakeHeight" _fakeHeight>> centimeters tall, your skin, <<listbox "_fakeSkin" autoselect>>
<<option "P*le">>
<<option "B*i#e">>
<<option "Ol*v#">>
<<option "Eb#n#">>
<</listbox>>.
And your name is…
<<textbox "_fakeName" _fakeName>>
<<button "CONFIRM">>
<<goto "Event_Major_Nostalgia_2">>
<</button>>
</div><<silently>><<run setup.startNostalgiaStaticBlend({ durationMs: 18000, introRatio: 0.16, staticRatio: 0.78, introEasePow: 1.45, staticEasePow: 2.75 })>><</silently>>
<div class="intro-creation no-click-sfx">
Yes… of course. The name crystallizes in your consciousness. It has always been yours, long before you ever began.
The fragments gather around it: eyes that have witnessed endings yet to come, hair stirred by winds you remember feeling tomorrow, skin marked by battles you have not yet fought. In that impossible reflection, you see yourself becoming what you already were.
But nothing follows.
No revelation. No comforting truth. No hidden answer waiting just beyond the veil.
Only silence.
At first it feels vast. Like the question. The answer, is just beyond your grasp. Then empty. Then something worse than empty. Something like refusal.
At last, a single thought rises from the nothingness, sharp with urgency, demanding to be known:
<<button "Where are you?">>
<<goto "Event_Major_Nostalgia_3">>
<</button>>
</div><<silently>>
<<script>>
setTimeout(function () {
if (setup && typeof setup.beginNostalgiaBlackoutReveal === "function") {
setup.beginNostalgiaBlackoutReveal({
holdMs: 10000,
audioId: "horsewalk",
audioCueMs: 8000,
audioFadeMs: 6500,
audioRatio: 0.42,
audioEasePow: 1.55
});
}
}, 0);
<</script>>
<</silently>>
<div class="nostalgia-blackout-stage">
<div class="nostalgia-blackout-content">
''<div class="hub-textbox">
<p>Your eyes open as the cart you are riding in hits a bump in the road. Yet you do not have the strength, or the will, to look up. Instead, your focus remains on the floor and the thing you are holding in your arms, hidden by the dirty blanket thrown over you.</p>
<p>"You awake, kid?"</p>
<p>asks an older man's voice. The voice is rough, low, and tired. A man sits opposite you. You can feel his eyes on you even without looking.</p>
<p>You do not answer, nor do you look up. You feel the person's eyes on you for a moment before he turns his head and sighs, seemingly satisfied with leaving it at that.</p>
<p>For a time, there is only the creak of wood, the slow clatter of wheels, and the steady rhythm of hooves against packed earth. Then, after what might have been minutes or an hour, the man speaks again.</p>
<p>"...We'll reach the city in half an hour or so. I'll figure out what to do with you then," the gruff voice says.</p>
<p>Silence follows.</p>
<p>The cart sways. The blanket in your arms shifts. Your fingers tighten around whatever lies beneath it.</p>
<p>Another bit of time passes before he speaks again.</p>
<p>"...So, what are you holding there?"</p>
<p>At first, you do not mean to answer, but the choice is taken from you as the cart hits another bump, larger this time, making your body jump up and what you were holding fall to the cart's floor. Before you can do anything, the man casually reaches down, picks it up, and inspects it. What he sees is...</p>
<div style="display:none">
“You awake, kid?”
asks an older man’s voice. The voice is rough, low, and tired. A man sits opposite you. You can feel his eyes on you even without looking.
You do not answer, nor do you look up. You feel the person’s eyes on you for a moment before he turns his head and sighs, seemingly satisfied with leaving it at that.
For a time, there is only the creak of wood, the slow clatter of wheels, and the steady rhythm of hooves against packed earth. Then, after what might have been minutes or an hour, the man speaks again.
“…We’ll reach the city in half an hour or so. I’ll figure out what to do with you then,”
the gruff voice says.
Silence follows.
The cart sways. The blanket in your arms shifts. Your fingers tighten around whatever lies beneath it.
Another bit of time passes before he speaks again.
“…So, what are you holding there?”
At first, you do not mean to answer, but the choice is taken from you as the cart hits another bump, larger this time, making your body jump up and what you were holding fall to the cart’s floor. Before you can do anything, the man casually reaches down, picks it up, and inspects it. What he sees is…
</div>
<div class="hub-buttons">
<<button "<span class='choice-text'>A little book. (Wisdom + Stewardship)</span>">>
<<set $nostalgia3Choice = "book">>
<<goto "Event_Major_Nostalgia_4">>
<</button>>
<<button "<span class='choice-text'>A wooden toy soldier. (Strength + Endurance)</span>">>
<<set $nostalgia3Choice = "soldier">>
<<goto "Event_Major_Nostalgia_4">>
<</button>>
<<button "<span class='choice-text'>A smiling mask. (Charisma + Leadership)</span>">>
<<set $nostalgia3Choice = "mask">>
<<goto "Event_Major_Nostalgia_4">>
<</button>>
</div>
</div>''
</div>
</div><<silently>>
<<if !$nostalgia3RewardApplied>>
<<if $nostalgia3Choice is "book">>
<<set $wisdom = Math.max(0, Number($wisdom ?? 0) + 1)>>
<<set $stewardship = Math.max(0, Number($stewardship ?? 0) + 1)>>
<<elseif $nostalgia3Choice is "soldier">>
<<set $strength = Math.max(0, Number($strength ?? 0) + 1)>>
<<set $endurance = Math.max(0, Number($endurance ?? 0) + 1)>>
<<elseif $nostalgia3Choice is "mask">>
<<set $charisma = Math.max(0, Number($charisma ?? 0) + 1)>>
<<set $leadership = Math.max(0, Number($leadership ?? 0) + 1)>>
<</if>>
<<set $nostalgia3RewardApplied = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if $nostalgia3Choice is "book">>
<p>He looks it over in his arms for a bit, turning it over as if examining a curious trinket.</p>
<p>“Hm. So you can read, then? Or do you just think it looks neat?”</p>
<p>He asks with mild curiosity, before a conclusion seems to hit him, making his next words come out slightly sour.</p>
<p>“Well... I suppose you had someone to teach you, didn’t you? It isn’t that strange.”</p>
<p>Before you can say anything, something hits your chest as he tosses the book back at you.</p>
<p>“Keep it for now. Might teach you something useful.”</p>
<p>He says as his eyes turn to the back of the driver’s head and the road ahead.</p>
<div class="result-list">
<div class="result-line good">
<span class="label">Wisdom</span>
<span class="value">+1</span>
</div>
<div class="result-line good">
<span class="label">Stewardship</span>
<span class="value">+1</span>
</div>
</div>
<<elseif $nostalgia3Choice is "soldier">>
<p>He looks the little soldier over in his hand. As you try to focus on his face, it seems blurry for some reason, but you cannot help feeling that something akin to amusement touches the serious man’s features.</p>
<p>“Hmm... A witch hunter figurine. These were popular when I was young, but I haven’t seen them around the markets these days. They have newer stuff... Well, I suppose the Marches still find this sort of thing novel.”</p>
<p>The man’s face turns to you again as he seems to give you a look over.</p>
<p>“You don’t really have the build for it, though. Too scrawny.”</p>
<p>Then you feel something hit your chest as he throws the wooden figurine back at you.</p>
<p>“Still, you might make it as a city guard... if you keep at it.”</p>
<p>He says as his eyes turn to the back of the driver’s head and the road ahead.</p>
<div class="result-list">
<div class="result-line good">
<span class="label">Strength</span>
<span class="value">+1</span>
</div>
<div class="result-line good">
<span class="label">Endurance</span>
<span class="value">+1</span>
</div>
</div>
<<elseif $nostalgia3Choice is "mask">>
<p>As the man looks the mask over, you feel him raise an eyebrow, even though you cannot seem to focus on his facial features.</p>
<p>“Huh. Now where did you get this...”</p>
<p>He says, his confusion giving way to curiosity as he seems to recognize it. Then you feel something hit your chest as he throws it back to you.</p>
<p>“Make sure you get a good look at it if you’re going to keep it. Knowing what a fake smile looks like will help you in life.”</p>
<p>He says as his eyes turn to the back of the driver’s head and the road ahead.</p>
<div class="result-list">
<div class="result-line good">
<span class="label">Charisma</span>
<span class="value">+1</span>
</div>
<div class="result-line good">
<span class="label">Leadership</span>
<span class="value">+1</span>
</div>
</div>
<<else>>
<p>[Somethign went wrong if you are seeing this]</p>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<unset $nostalgia3Choice, $nostalgia3RewardApplied>>
<<goto "Event_Major_Nostalgia_5">>
<</button>>
</div>''<div class="hub-textbox">
<p>The ride continues, as silence, other than the horses’ hooves and the sound of the cart’s wheels, envelops the cart once more. An hour passes. Then two. Then—</p>
<p>“There it is.”</p>
<p>The man says, his face turned toward the road ahead. Your eyes subconsciously turn in the same direction. And then you see it.</p>
<img src="images/events/nostalgia/home.png" alt="Amogus">
<p class="nostalgia-sleep-trigger">Your eyes, previously unfocused and not looking at anything in particular, widen. You see towers that pierce the sky. Walls that look like mountains. A city that, even this far away, still looks like the biggest thing you have ever laid eyes on. For his part, the man speaks in a casual tone, not sharing your shock or surprise.</p>
<p>“Home, sweet home.”</p>
<p>He mutters, somewhat apathetically. As you near the grand city, you simultaneously feel all the tiredness your body has been storing come to claim its due, yet feel unable to look away from the sight before you as you fight to keep your eyes open.</p>
<p>You also feel the man’s eyes on you again. Silently at first, as he seems to observe you. Then he says:</p>
<p>“The city is still a ways off, despite how it may look. Sleep. It’s not going anywhere. And you’ll have plenty of chances to get familiar with it...”</p>
<p>He sighs as he looks back to the road.</p>
<p>“...Whether you want to or not.”</p>
<p>Whether it is because you decide to heed an elder’s advice, or simply because your drowsiness wins out, you feel your body relax in its seat as your eyes slowly close... first comes darkness...</p>
<img src="images/events/nostalgia/home_memory.png" alt="Amogus">
<p>...Then nothing.</p>
</div>''
<div class="hub-buttons nostalgia-sleep-target">
<<button "<span class='choice-text'>Wake up</span>">>
<<goto "Event_Major_Nostalgia_6">>
<</button>>
</div><<silently>><<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("horsewalk") : null>><</silently>>''<div class="hub-textbox">
<p>You jump up and sit at the edge of the furs you were lying on, your body covered in sweat. You quickly look around, only to confirm that you are back in your own body, lying in your tent.</p>
<p>After a moment passes, the memories of the dream, of the large structure you saw, already begin to slowly fade into nothing.</p>
<p>Your breathing calms as you subconsciously reach for the strange stone. As you feel it in your hands, you realise the warmth it had yesterday, or at least the warmth you imagined it had, has disappeared, replaced by a cold quiet, while its purple colours seem to move even in your palm.</p>
<p>After a bit, you put it back before slowly getting up. It is a new day, and as chieftain, that means new work that needs doing...You cant think about forgotten dreams forever.</p>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Go about your day</span>">>
<<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("LostTime") : null>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
/* ===========================
Quest spawn + NPC presence checks =========================== */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* ---- NPC presence checks by id (no functions; SugarCube-safe) ---- */
<<set _hasKael = false>>
<<set _hasOutcast = false>>
/* Change these IDs if yours differ */
<<set _KAEL_ID = "npc_kael">>
<<set _OUTCAST_ID = "npc_outcast">>
/* Check $people first */
<<if $people and $people.length>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _KAEL_ID>>
<<set _hasKael = true>>
<</if>>
<<if $people[_i] and $people[_i].id is _OUTCAST_ID>>
<<set _hasOutcast = true>>
<</if>>
<</for>>
<</if>>
/* Fallback to $campNpcs (Interact list) */
<<if $campNpcs and $campNpcs.length>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<if !$hasKael and $campNpcs[_i] and $campNpcs[_i].id is _KAEL_ID>>
<<set _hasKael = true>>
<</if>>
<<if !$hasOutcast and $campNpcs[_i] and $campNpcs[_i].id is _OUTCAST_ID>>
<<set _hasOutcast = true>>
<</if>>
<</for>>
<</if>>
/* ---- Create the quest once (your widget already prevents duplicates via $questFlags[_qid]) ---- */
<<addQuestAdjacentToCamp
"q_moving_hill_01"
"The Moving Mountain"
"A scout returned from the scouting mission shaken—he swears he found a strange, perfectly-shaped hill… and that it vanished the next day."
"Go to the marked tile and use Expedition."
"Quest_MovingHill_01">>
/* Optional: track it so its marker stands out */
<<set $trackedQuestId = "q_moving_hill_01">>
<</silently>>
''<div class="hub-textbox">
You are approached by one of your tribesmen—the one you sent to scout farther west than the others.
He has been gone for many days, but now he finally returns.
The look on his face is tinged with confusion and fear.
You ask him what’s wrong.
<br><br>
“Chief… I searched the forest further inland like you commanded… but what I found was… strange. There was a mountain—yet unlike any I’ve ever seen before. At first it could be mistaken for an ordinary hill… but its proportions were too even, its edges too smooth. It was covered in grass, as if it were trying to hide the stone beneath… and yet the strangest part is this: when I went back the next day… it was gone.”
He swallows, sounding shaken.
“I was confused. Did I take a wrong turn somewhere? Did I make a mistake? But when I retraced my steps… I’m sure it was the path I took.”
After a moment to steady himself, he continues in a quieter voice:
“I don’t know what that was, but strange spirits inhabit this land, chieftain.”
With that, he finishes his report and walks off.
<br><br>
<<if _hasKael>>
Kael, who was listening as well, chimes in after the scout disappears, arms crossed.
<br><br>
“Rutvig isn’t one to lie—and he isn’t one to get lost while scouting, either. The only miracles I’ve seen performed, and the only ones I believe in, are the ones you seem capable of, $user… but I’d still take heed of his words.”
<br><br>
<</if>>
<<if _hasOutcast>>
The outcast girl, for her part, raises an eyebrow at the story.
“Moving hills? It does sound similar to some tales my grandmother used to mention… but I don’t know anyone who’s seen it in person.”
<</if>>
Definitely something to think about.
<br><br>
<div class="result-list">
<div class="result-line good">
<span class="label">Task accepted</span>
<span class="value">Investigate the moving hill</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
Another day passes, and with it another successful hunt. As you make your way back through camp in search of food, your eyes catch on a familiar figure.
Kael stands near the camp’s edge, still as stone, his gaze fixed on something far beyond the tree line.
You approach him from behind.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Is something the matter?</span>">>
<<goto "Event_Major_KaelScout_Concern">>
<</button>>
</div>\:: Event_Major_TEMPLATE
<<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
<div class="hub-textbox">
(Event prose here.)
</div>
<div class="hub-buttons">
<<button "End Event">>
<<endMajorEvent>>
<</button>>
</div><<silently>><<npcAlive "npc_outcast_brother">><</silently>>
''<div class="hub-textbox">
A few days after the encounter, after dealing with the men who were pursuing Halona’s brother and getting affairs for the season sorted, you decide to visit her at her tent.
<<if not _npcAlive>>
You find her pacing inside, back and forth, over and over again. She’s been silent ever since the ordeal, and she remains so even now. She has neither mourned nor spoken.
<<if $wisdom >= 5>>
Yet when she turns and notices you, you see the rims of her eyes are red. The moment she realizes you’ve seen it, she turns her head away.
<</if>>
You stand there for a few moments, waiting for her to speak. She doesn’t. You start to turn around and leave, but then she says, quietly:
“I do not blame you, $user, if that is what you are thinking.”
Her voice is even, her emotions hard to read. She keeps looking off to the side, at nothing at all, as you turn back to face her. She’s silent for another moment, and then you notice the way she’s holding herself, arms wrapped tight around her body, fingers digging in.
“I blame Kavonok, and the cowards who bow to him. The ones who sell blood and loyalty for the scraps he promises them, and for the beatings he chooses not to give.”
She falls silent again. You keep staring, whatever you feel hidden behind your eyes, known only to you.
Maybe you’re about to say something. Comfort her. Tell her the strong decide how the world works. Maybe you’re preparing to leave the tent again.
But before you get the chance, she suddenly turns and grabs your arm. Her hand is small, but the grip is firm, full of strength.
“Stay.”
She doesn’t look at you directly. She doesn’t let go.
“You helped me when most would have left me to die, or helped me and then abandoned me after. You deserve a reward for your efforts.”
She turns and looks at you again. Then she leans in, slowly, bringing her lips up to meet yours.
<<else>>
Yet even before you enter, you hear shouting and unfamiliar swear words. When you glance around, you see the commotion has already drawn a few curious eyes from the camp, even if nobody understands a word of it.
Just as you reach the tent flap, a man stumbles out backwards, one hand raised as if to shield himself from whatever’s inside. You recognize him as the one you saved yesterday.
“Sister, listen to me! It’s fine! I’m fine! You’re fine! Everything worked ou—”
He doesn’t get to finish.
A wooden cup comes flying out of the tent and cracks him in the temple. It hits close to where he’s still healing, splintering on impact. He staggers, trips, and lands hard in the mud right in front of you.
Rubbing his head, he mutters, “Shunte…”
Then he notices you looking down at him, eyebrow raised. Embarrassment hits him all at once. He scrambles up, talking too fast.
“Ah, $user! I haven’t even had the chance to thank you yet. I apologize for you seeing me like this, and for causing a ruckus. You see, my older sister is quite temperamen—”
A boot to his backside cuts him off and sends him right back into the mud.
“I am not temperamental,” Halona says, her voice calm in a way that promises violence if anyone argues, “just because I don’t tolerate fools, Tiksi.”
She steps closer, eyes hard.
“What were you thinking? I told you to run to the camp of Tribe2 and seek refuge with them, and yet I find you still running from Kavonok’s dogs. Why do I have a new scar from a spear-tip on my stomach?”
He opens his mouth, voice naturally meek, pride trying to fight through it.
“I… You were in danger! I didn’t ask you to make a distraction! I was fine, and I wasn’t going to leave my sister to—”
Another kick.
“Shut up.” She exhales through her nose. “Just be glad I found someone willing to save your sorry hide, Tiksi.”
Despite her tone, she hauls him up with surprising care, then gives him a short push away from the tent.
“Now go lie down. You still haven’t healed.”
He mutters as he starts limping off.
“Well, at this rate I don’t think I ever will…”
Halona doesn’t reply. She just gives him a look that makes him pick up his pace.
Then her glare swings back to you. She grabs your arm and tugs you toward the tent.
“You. Inside. Now.”
You comply with the angry woman.
<</if>>
</div>''
<div class="hub-buttons">
<<if not _npcAlive>>
<<button "<span class='choice-text'>Let the situation continue</span>">>
<<goto "Event_Major_TheDayAfter_LetTheSituationContinue">>
<</button>>
<<button "<span class='choice-text'>Stop her</span>">>
<<goto "Event_Major_TheDayAfter_StopHer">>
<</button>>
<<else>>
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_Comply">>
<</button>>
<</if>>
</div>''<div class="hub-textbox">
As you step inside and the tent flap falls closed behind you—cutting off the curious eyes outside. She finally lets go of your hand. She folds her arms across her chest and fixes you with a glare that could strip bark from a tree.
“I apologize for my brother. He is a fool, but a pure one. And whether I want it or not, he’s the only family I have left.”
It sounds like she’s about to launch into a tirade, but she stops herself. She draws in a long breath, then lets it out slowly. When she speaks again, her tone is calmer.
“But that isn’t what matters right now.”
Her gaze hardens as she delivers the next words, stern and precise, like sealing a bargain.
“Thank you. What you did saved me… and now my brother.”
Then the sternness slips. Her voice softens. She looks away, as if she can’t hold your gaze for long.
“…You did more for us than you had any obligation to. Too much to be chalked up to simple decency. More than we can repay.”
A short silence. A quiet exhale. When she looks back at you, the firm expression has returned.
“But that doesn’t mean I won’t try.”
She crosses her arms again.
“So. What do you want as your reward? Riches?” A bitter edge touches her words. “Anything my brother was entitled to is out of our hands now, after our tribe betrayed us. If we ever manage to claw it back, you’d have a claim to it… but promising what you don’t have isn’t much, is it?”
She watches you closely.
“So. Is there something else you want? My brother and I can work. We can contribute double what your other people do, if that’s what it takes.”
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Nothing</span>">>
<<goto "Event_Major_TheDayAfter_Nothing">>
<</button>>
<<button "<span class='choice-text'>You</span>">>
<<goto "Event_Major_TheDayAfter_You">>
<</button>>
</div>''<div class="hub-textbox">
The fabric of the tunic hits the floor, followed quickly by the rustle of her leggings. Halona stands before you exposed, her skin flushed a dark, angry pink against the flickering candlelight.
She doesn't wait for you to admire the view. Her hands are on your chest, shoving you backward with surprising force. You stumble, the backs of your knees hitting the edge of the sleeping pallet before you fall onto the rough wool blankets.
“Don’t talk,” she snaps, straddling your hips before you can fully settle.
The intrusion is sudden and violent. There is no practised ease in the way she lowers herself onto you, only a stubborn, grinding determination as she forces her body to accept the intrusion.
You feel an immense, unyielding resistance. Her cunt is an incredibly tight sheathe, clamping down on your cock in a panic reflex as the thick head stretches her open for the first time. It grips you like a vice, the heat searing, the friction intense enough to border on pain.
Her breath hitches, a sharp intake of air through her nose, but she doesn't stop. She braces her hands harder on your shoulders, her fingernails cutting into the skin, using the leverage to force her hips down. A barrier gives way with a sudden tear, and she sinks fully, impaling herself on your length.
She cries out, a choked sound that she immediately bites back, her teeth sinking into her lower lip until the skin turns white.
“Just... just take it,” she hisses through clenched teeth, her voice strained.
<<nsfwimg "images/events/dayafter/sex1.webp">>
You feel the fluttering spasms of her inner walls as they struggle to adjust to the sheer size filling her. It is drowningly tight, a hot, wet pressure that milks your shaft involuntarily.
She doesn't move for a moment, her body trembling violently atop yours. Her eyes are open, staring down at you, but the gaze is hollow. She looks right through you, fixing on a point in the shadows behind your head, dissociating from the sharp ache between her legs.
She starts to move, but there is no rhythm, only jagged, desperate thrusts. She lifts her hips slightly and drops back down, the motion awkward and jarring. You feel every ridge of her insides dragging against your sensitive skin, the lubrication mixing with a thin trace of iron to ease the passage.
“Look at me,” she repeats, but her voice cracks, the command dissolving into a plea. “Don’t look away.”
Her hips slam down harder. The sound of skin hitting skin is wet and sharp, echoing in the small space. Her small tits bounce erratically with the force of her movements, the dark nipples pointing stiffly towards the ceiling. Her abdomen flexes, the muscles knotting as she drives herself onto you, using the pain of the penetration to numb whatever is screaming inside her head.
Her cunt constricts around you rhythmically, unwillingly, the natural reaction of a body overwhelmed by stimulation. She feels impossibly tight, like a hot, velvet glove that is too small, squeezing the life out of your dick with every clumsy drop of her hips.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_LetTheSituationContinue_2">>
<</button>>
</div>''<div class="hub-textbox">
Inside her, the walls flex and ripple violently, the tight grip becoming suffocating as her orgasm crashes through her. You feel the sudden rush of hot fluid flooding around your shaft, mixing with the slick lubrication and the thin trace of blood. She shakes uncontrollably, her nails digging into your shoulders hard enough to draw blood, her entire body seizing up in a rigid arc before she collapses forward, her forehead hitting your chest.
The sensation pushes you over the edge. Your balls tighten, drawing up against your body, and a thick rope of cum erupts from the tip of your cock, painting her insides with your seed. You pulse inside her, spurt after spurt filling her up until the excess leaks out around the edges of your joining, dripping down your shaft and soaking into the coarse hair at the base.
<<nsfwimg "images/events/dayafter/sex2.webp">>
For a long moment, the only sound in the tent is breathing. Heavy. Ragged. Uneven.
Halona lies limp atop you, her body rising and falling against yours. Her skin is fever-hot, sweat-slick where her chest presses to your own, but there is no softness in it. No comfort. Only heat and weight and the slow return of silence.
Then, gradually, she pushes herself upright.
Whatever raw desperation had driven her a moment ago is gone now, wiped clean from her face. What remains is something flatter. Colder. A numbness pulled tight across her features like a second skin.
She lifts herself off you with stiff, careful movements. A trace of what you left inside her follows, running slowly down the inside of her thigh and dripping onto the worn rug below. She does not acknowledge it. If she feels the soreness in the way her legs tremble, she gives no sign beyond the brief tightening of her jaw.
She stoops, snatches up her tunic, and pulls it over her head. The rough fabric falls into place, covering the flushed skin, the trembling in her stomach, the red around her eyes.
“We are even,” she says.
Her voice is flat. Not calm. Not angry.
Empty.
She does not look at you.
She turns away instead, crossing the tent on unsteady legs toward the little table where her herbs and carvings lie scattered. Her back is rigid. Closed. She reaches for the waterskin and drinks from it in long pulls, as though washing something out of her mouth. As though the act itself can be swallowed down and buried somewhere deeper.
The tent feels colder now.
The smell of sweat, sex, and blood hangs in the air, stale and sour in the candlelight. Nothing in her posture invites words. Nothing in the set of her shoulders suggests she wants comfort, explanation, or thanks.
She says nothing else.
She only stands there with her back to you, silent and waiting. The meaning is obvious.
Leave.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_NextDay">>
<</button>>
</div><<silently>>
<<set _pid = "npc_outcast">>
/* Remove from CAMP NPC list */
<<if $campNpcs and $campNpcs.length>>
<<set $campNpcs = $campNpcs.filter(n => n and n.id !== _pid)>>
<</if>>
/* Remove from generic people list */
<<if $people and $people.length>>
<<set $people = $people.filter(p => p and p.id !== _pid)>>
<</if>>
/* Clear selection only if it points to her */
<<if $activePersonId is _pid>><<set $activePersonId = null>><</if>>
<<if $selectedPersonId is _pid>><<set $selectedPersonId = null>><</if>>
<<if $personSelectedId is _pid>><<set $personSelectedId = null>><</if>>
<<if $personInfoId is _pid>><<set $personInfoId = null>><</if>>
/* Clear talk/menu state safely */
<<run (State.variables.npcTalkMenu && _pid) ? (delete State.variables.npcTalkMenu[_pid]) : 0>>
<<run (State.variables.npcTalks && _pid) ? (delete State.variables.npcTalks[_pid]) : 0>>
<<set _grantedOutcastIdol = false>>
<<if not $outcastIdolRewardGranted>>
<<run setup.inventory.add("outcastIdol", 1)>>
<<set $outcastIdolRewardGranted = true>>
<<set _grantedOutcastIdol = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
After finishing up your work for the day, you end up back in your tent, enjoying a rare moment of peace while a few of your tribe’s women fuss over you—hands working out the stiffness in your shoulders and arms. Being chieftain doesn’t often leave room for rest.
<<nsfwimg "images/events/dayafter/massage.gif">>
The tent flap lifts, and Kael steps in.
He looks at you, taking in the scene without so much as a raised brow. He gives you a small nod and says, flatly:
“$user. The outcast girl you rescued is gone.”
He pauses, watching your face for a reaction, then continues.
“It seems she slipped out during the night. Finnan was on guard.”
He shrugs.
“He took a beating for being lax, of course… but.” Kael glances out of the tent for a moment. “I don’t think it was entirely his fault. Finnan takes his work seriously.”
He looks back at you, and there’s the faintest edge of dry amusement in his voice.
“I think it’s just that our chieftain seems to like saving agile foxes.”
He lets that hang for a moment, then reaches into a small hide pouch at his belt as he speaks again.
“She gave me something yesterday. I didn’t understand much—her tongue is foreign—but after what’s happened…”
He pulls out a beautiful, intricate wooden carving: a buffalo, sturdy and proud in the grain.
“…I’m guessing this was her way of saying thanks.”
Kael crouches and sets it carefully in the corner of your tent, then straightens.
“Either way, I’ve got work around camp to do, $user. Call for me if you need anything.”
And with that, he slips back out, leaving you amid warm hands and quiet murmurs, your thoughts turning over on themselves as your eyes drift back to the buffalo carving.
<<if _grantedOutcastIdol>>
<div class="result-list">
<div class="result-line good">
<span class="label">Item added</span>
<span class="value">Outcast Idol</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run (function () {
const V = SugarCube.State.variables;
const h = setup.people.upsert("npc_outcast", {});
h.love = Number(h.love ?? 0) + 10;
V.halonaLoveGain = 10;
})();>>
<</silently>>
''<div class="hub-textbox">
You tell her plainly. You don’t need a reward. Maybe it’s guilt for failing to save her brother. Maybe it was never about payment to begin with.
She stares at you, half shocked, half offended.
“Don’t need a—”
She cuts herself off, releases your arm, and takes a step back. When she looks at you again, she’s squinting. The fire is back in her eyes, and in her voice.
“Don’t need a reward, he says… Do you take me for a fool?”
She starts pacing the tent again.
“So what, you drag me back from the edge of death, you offer to save my brother too… why? Because you’re some Adan Spirit?”
It’s a kind of spirit your people don’t speak of, but the meaning is clear enough from the way she spits the words. You just look at her, expression blank.
She watches you for a moment, like she can’t believe what she’s seeing, then throws her hands out in frustration.
“Then why have you been coming to my tent every day, if you weren’t waiting for a reward?”
You still don’t answer. Whatever she reads in your silence—in the look you give her—it takes some of the heat out of her. Her shoulders loosen. Her voice drops.
“Shunte.”
A curse in her tongue.
“So I lose one naive fool, and the spirits send me a different kind to take his place. They always did love their jokes.”
She won’t look at you now. She flicks her hand toward the entrance, dismissing you.
“Alright. You’ve seen whatever it is you came to see. Off with you.”
After a moment, you do as she says. You turn and start to leave.
Just before you step out, your sharp hearing catches something soft behind you.
“…Thank you.”
As you leave the tent, you find yourself turning the thought over and over. Can you save everyone? Maybe not. Not yet, at least. You can’t promise you won’t make mistakes again. But you can make sure you’re there to deal with the consequences—to shoulder what you can, to lighten what others would otherwise be forced to carry because of your decisions.
You can be there. Always.
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print $halonaLoveGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<run (function () {
const V = SugarCube.State.variables;
const h = setup.people.upsert("npc_outcast", {});
h.love = Number(h.love ?? 0) + 15;
V.halonaLoveGain = 15;
})();>>
<</silently>>
''<div class="hub-textbox">
She watches you a moment longer, like she’s waiting for the punchline. When it doesn’t come, surprise slips into her voice despite herself.
“…Nothing?”
She turns the word over like it’s unfamiliar, like it has no place here. Her eyes narrow.
“I refuse.”
Flat. Final.
You don’t answer. You don’t reach for excuses. You just stand there, calm and unmovable, letting her decide what to do with the silence.
For a heartbeat it throws her off. She takes a step as if to pace, stops, then takes another, as though the tent suddenly isn’t big enough for her temper.
“No,” she says, sharper now, pointing at you like she can pin you in place with a finger. “You don’t get to do that. You don’t pull someone back from the edge, save her brother too, and then act like it cost you nothing.”
Her gaze flicks over your face, searching for something—smugness, hunger, some sign of a hidden cost or desire.
You give her none of it.
That only makes her jaw tighten.
“In my people’s way,” she says, voice controlled, “a debt left hanging turns into rot. It turns into pity. It turns into a leash.” Her mouth twists. “I will not wear that.”
She exhales, slow, as if dragging her anger back under her ribs.
“You want nothing,” she repeats, almost accusing you of it. “Fine. Then I will still repay it.”
She steps closer before she seems to realize she’s doing it—close enough that you can feel the heat of her, the sharpness of her breath. Her eyes hold yours and refuse to let go. The tension in the air changes. Not softer, exactly. Just… different. Like her fury is covering something else.
“My brother and I will work,” she says, and the words come out like a vow. “We will contribute. Double, if we have to. Not as guests. Not as burdens. As hands.”
She waits, watching you like she’s daring you to object.
You still don’t speak.
For a moment she looks almost angry at her own reaction to that silence—like it’s unfair that you can unsettle her without even trying.
“…So give me something,” she says, quieter, but no less firm. “A task. A rule. A price with a name. Something that closes this.”
Your gaze shifts, just slightly, toward the tent flap and the camp beyond. Not you. Them. The people outside. Your people. Your tribe.
Halona follows your look. She goes still, reading it. Then her shoulders ease a fraction, as if the shape of the world has finally clicked back into place.
“…Your tribe,” she says, and there’s a strange edge to it—half relief, half annoyance. “Not you.”
Her eyes return to yours. The fire is still there, but it’s steadier now. Less wild.
“Fine.” She nods once. “Then we repay your tribe. We earn our place until no one can call it charity.”
She holds your gaze a second longer than she needs to—long enough to make the air feel tight again. Then she looks away, like she’s the one who has to break it.
“Now go,” she mutters. “Before I start arguing with you again.”
You give a small nod and take your leave, your mind turning over the choices you’ve made so far. As you step out of her tent, you can’t help but feel a pair of eyes tracking you until the flap falls shut.
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print $halonaLoveGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<endMajorEvent>>
<</button>>
</div><div class="hub-textbox">
She hears your answer. For a moment, she says nothing. Then she lets go of your hand and takes a few steps back.
“I see,” she says simply. There’s no sting in her voice, no sign of offence. Maybe there would be, under different circumstances—but right now, other things weigh heavier on her mind.
“Then if that’s everything, please leave. I’ll find another way to pay you back.” She turns away again, showing you her back. You do as she asks, and step out of her tent.
</div>
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_NextDay">>
<</button>>
</div>''<div class="hub-textbox">
She hears your answer and looks up at you, weighing it. For a moment she just studies you. Then her eyes flick over you again, like she’s quietly redoing the measure of you in her head.
When she speaks, there’s a spark of the old fire in her voice—brief, but real.
“Why?”
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>You don’t need a reward</span>">>
<<goto "Event_Major_TheDayAfter_NoReward">>
<</button>>
<<button "<span class='choice-text'>You don’t want her</span>">>
<<goto "Event_Major_TheDayAfter_Reject">>
<</button>>
</div>''<div class="hub-textbox">
Halona stares at you, her brow furrowing deeply as the silence stretches between you.
“You?” she says. “What do you mea—”
The realization hits her before the sentence can finish.
Her eyes narrow at once, the brown darkening with a sharp, wounded disdain.
“Of course,” she says. “And here I actually thought I’d met an intelligent man for the first time. What a fool I was.”
She turns her head sharply aside, snapping her gaze away from yours and fixing it on the tent wall. Even in the dim candlelight, you can see the dusty pink flush spreading across the bridge of her nose and staining her cheeks. She folds her arms tighter across her chest, as if she can physically hold herself together through sheer stubbornness.
“Men are all the same,” she mutters. “Blood, coin, or a body to claim once they think they’ve earned it.”
She practically spits the words, but the force behind them is uneven. Her voice trembles, just slightly.
“You save my brother’s life and decide to claim the sister as payment.” Her mouth twists. “How noble. How utterly predictable.”
She still refuses to look at you, but you see her throat work as she swallows. Her fingers tap an erratic rhythm against her own upper arm.
Then, after a moment, she turns back.
“Well?” she snaps. Her chin is high, her eyes bright with a defensive anger that doesn’t quite hide what sits beneath it. “Come here, then. I said I pay my debts. I won’t have you saying I welched on a bargain.”
She does not wait for you to move.
She steps forward herself, closing the distance in one jerky, aggressive motion. Her hands fist in the fabric of your tunic.
“Just…” she says, and for the first time the words catch. “Don’t expect me to be graceful about it.”
Then she rises onto her toes and presses her mouth to yours.
It is hard and clumsy, more collision than kiss. You taste mint and the bitter trace of herbs.
Her teeth click against yours, sharp and sudden, and for a moment her whole body goes rigid with the effort of forcing herself not to pull away. But she stays there.
She makes herself stay there, lips pressed to yours, breath unsteady, her grip on your tunic tightening as though stubbornness alone will carry her through it.
When she finally pulls back, she does it abruptly, drawing in a quick breath. Her chest rises and falls against yours. Her lips are wet, slightly swollen.
“That was terrible,” she mutters, wiping her mouth with the back of her hand.
Then, after the briefest pause:
“…So stop looking at me like that.”
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_You_2">>
<</button>>
</div>''<div class="hub-textbox">
Her hands drop to your waist, fumbling clumsily with the laces of your trousers.
"I've never done this before, so if you laugh, I'll knife you. I swear it."
She finally manages to undo the knots, pushing the rough fabric down. Your cock springs free, thick and heavy, bouncing slightly from the movement. Halona stares at it, her eyes going wide. The flush on her cheeks deepens to a dark crimson, and she doesn't look away. She can't seem to look away.
"Gods," she breathes out, the word barely a whisper. "It looks... angry. And huge." She swallows visibly, her Adam's apple bobbing in her slender throat. "You really expect me to fit that in my mouth?"
She drops to her knees on the woven rug, looking up at you with a mixture of apprehension and a strange, hesitant hunger.
"I'm doing this for my brother," she mutters, though her voice lacks conviction now. She reaches out with both hands.
Her palms are rough, calloused from years of archery, but her touch is hesitant, almost reverent. She wraps her fingers around your girth, her grip unsure. She gives a soft squeeze, feeling the hard heat of you against her skin, and a shiver runs through her shoulders.
"It's like holding a rock wrapped in skin," she whispers, leaning closer without realizing it. She starts to stroke you, her movements experimental. Her hand glides up the shaft, her thumb brushing over the leaking slit, smearing the sticky pre-cum over the head. She watches the fluid bead up again, biting her lower lip, fascinated by the visceral reaction she's pulling from you.
"Is that... good?" She doesn't give you time to answer. "Don't tell me. I don't care. Just... make a noise if you aren't bored."
She leans in closer, the scent of her arousal mixing with the smell of the tent. She sticks her tongue out, giving the head a tentative lap. She recoils slightly at the taste, then leans back in, eyes narrowing in concentration.
"Salty." She opens her mouth wide, her jaw stretching as she guides the tip past her lips. The wet heat of her mouth engulfs you, intense and sudden. She takes only the head at first, sucking tentatively, her tongue pressing awkwardly against the sensitive underside.
<<nsfwimg "images/events/dayafter/blowjob1.webp">>
Her hands continue to work the base, twisting slightly as she tries to find a rhythm. It is messy and unpracticed, saliva pooling at the corners of her mouth and dripping down her chin.
She makes a low, frustrated noise in the back of her throat and tries to take you deeper, choking immediately as your cock hits the back of her throat. Her eyes water, but she pulls back only slightly, determination hardening her features as she bobs her head, taking you a little deeper with every attempt, her annoyance at her own clumsiness mixing with a growing desire to take all of you.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Event_Major_TheDayAfter_You_3">>
<</button>>
</div><<silently>>
<<run (function () {
const V = SugarCube.State.variables;
const h = setup.people.upsert("npc_outcast", {});
h.love = Number(h.love ?? 0) + 10;
V.halonaLoveGain = 10;
})();>>
<</silently>>
''<div class="hub-textbox">
Halona’s mouth is a hot, chaotic mess around your shaft. She doesn't have the skill to make this art, but she attacks the task with a fierce determination that makes up for it. Her tongue swirls unpredictably over the sensitive ridge of your cockhead, while her hand pumps the base in a tight, slippery fist.
She pulls back to gasp for air, saliva dripping from her swollen lower lip to her chin.
"You're twitching,"
she accuses, her voice coming out rough and wet. You almost seem to detect a hint of pride in her voice. She dives back down, taking you deep enough to choke herself.
The wet, gagging sound vibrates through your groin. You feel the pressure spike instantly. Your balls tighten, and the first thick rope of cum erupts directly into her throat. She jerks back in surprise, coughing. Your cock slips from her lips, pulsing violently.
The next few spurts stripe across her face. Hot, thick lines of white splashing over her cheek, nose, and into her dark eyelashes. Some lands on her lower lip, hanging there for a moment before dripping onto her chest.
<<nsfwimg "images/events/dayafter/blowjob2.webp">>
"Gods!"
she sputters, wiping her eye with the back of her hand. She stares at the mess coating her face with wide, shocked eyes, looking down at the sticky fluid cooling on her skin.
"It just... keeps coming."
She snatches up a rough cloth from a nearby crate and scrubs at herself with harsh, irritated strokes, as though force alone can erase what just happened. The flush on her cheeks burns darker than ever, spreading all the way to her ears. Even as she wipes herself clean, you catch her glancing once at the damp smear on the cloth—a strange, unwilling flicker of curiosity crossing her face before she crushes it flat.
“You’re impossible,” she mutters. The words come out sharper than they need to, but there’s no real venom behind them. Only embarrassment, trying to dress itself up as anger.
She rises quickly and adjusts her tunic, tugging the fabric back into place with short, rough motions. By the time she turns away, her posture has gone rigid again, her arms folding tight across her stomach like a shield.
“We are even,” she says.
Her voice is steadier now, but she still won’t look at you.
“My brother is safe. And I…” She hesitates, just for a moment, then forces the words out. “I did what you asked.”
She glances back over her shoulder, eyes narrowed in warning, though the red still lingering in her face dulls some of the effect.
“Don’t mistake this for anything else,” she says. “And don’t start thinking you can come back here whenever the urge strikes you. I am not one of your playthings to be summoned when it suits you.”
She jerks her chin toward the tent flap.
“Go.”
Then, after the briefest pause, more quietly:
“I need to clean myself properly.”
Whether you want to answer, tease her, or simply leave the moment where it lies, in the end you step out into the open air and leave her alone with her thoughts—and the aftermath she refuses to let you see.
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print $halonaLoveGain>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _ev = $currentEvent ?? ($eventQueue and $eventQueue.length ? $eventQueue[0].event : null)>>
<<set _name = _ev?.sourceTribeName ?? _ev?.title ?? "Tribe Destroyed!">>
<<set _text = _ev?.text ?? "A tribe has fallen.">>
<</silently>>
''<div class="hub-textbox">
<h2><<print _name>></h2>
<p>
Word reaches you the way it always does out here—late, warped, carried on someone else’s breath. A runner with split lips. A hunter who speaks too quickly. Tracks that end too suddenly.
</p>
<p>
The details don’t hold. Names smear. Numbers change. The tale reshapes itself depending on who’s trying to sleep afterward.
</p>
<p>
But the end stays the same: a fire has gone out somewhere.
</p>
<p><<print _text>></p>
<p>
Some will blame strangers. Some will blame spirits. Some will whisper a chieftain’s name—yours, or another’s—because people always need a hand to point at.
</p>
<p>
Whether it was done by your enemies, friends, or <i>by</i> you— the land has opened a quiet space, and quiet spaces never stay empty for long.
</p>
</div>''
<div class="hub-buttons">
<<button "End Event">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
/* Persistent raid context */
<<if !$raidCtx>><<set $raidCtx = {}>><</if>>
<<if !$raidCtx.log>><<set $raidCtx.log = {}>><</if>>
/* Store attacker identity (if provided) */
<<set $raidCtx.sourceTribeId = _ev ? (_ev.sourceTribeId ?? _ev.sourceTribeID ?? _ev.tribeId) : ($raidCtx.sourceTribeId ?? null)>>
<<set $raidCtx.sourceTribeName = _ev ? (_ev.sourceTribeName ?? "Unknown") : ($raidCtx.sourceTribeName ?? "Unknown")>>
/* (Re)start raid run state (only if not already active) */
<<if !$raidCtx._active>>
<<set $raidCtx._active = true>>
<<set $raidCtx.retreatDone = false>>
<<set $raidCtx.prepChoice = null>>
<<set $raidCtx.prepDone = false>>
<<set $raidCtx.battleDone = false>>
<<set $raidCtx.milBonus = 0>>
<<set $raidCtx.dcMod = 0>>
<<set $raidCtx.log = {}>>
<</if>>
/* Find tribe + met flag */
<<set _tribe = null>>
<<set _met = false>>
<<if $tribes and $tribes.length and $raidCtx.sourceTribeId>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is String($raidCtx.sourceTribeId)>>
<<set _tribe = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _met = (_tribe and !!_tribe.contacted) or ($metTribeIds and $metTribeIds[$raidCtx.sourceTribeId])>>
/* Only call effect if it’s actually a function */
<<set _hasEffectFn = (_ev and _ev.effect and (typeof _ev.effect === "function"))>>
<<if _entry and _hasEffectFn and !_entry._applied>>
<<run _ev.effect()>>
<<set _entry._applied = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if _met>>
<div>
<b><<print $raidCtx.sourceTribeName>></b>
</div>
Those <<print $raidCtx.sourceTribeName>> bastards are raiding us! As chieftain, you need to take decisive action.
<<else>>People emerge from the trees and the mist—too many, too close.
You don’t know who they are, but you know what they want.
<</if>>
The camp jolts awake: shouting, grabbing spears, children pulled behind huts. You have seconds to choose what kind of leader you are going to be.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-num'>1</span><span class='choice-text'>Order a retreat to the woods</span>">>
<<goto "Event_Major_TribeRaid_Retreat">>
<</button>>
<<button "<span class='choice-num'>2</span><span class='choice-text'>Prepare the defenses</span>">>
<<goto "Event_Major_TribeRaid_DefendPrep">>
<</button>>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = $raidCtx.log ?? {}>>
/* Find attacker tribe */
<<set _tribe = null>>
<<if $tribes and $tribes.length and $raidCtx.sourceTribeId>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is String($raidCtx.sourceTribeId)>>
<<set _tribe = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Met flag + display name */
<<set _met = false>>
<<if _tribe>>
<<set _met = (!!_tribe.contacted) or (!!($metTribeIds and $metTribeIds[_tribe.id]))>>
<</if>>
<<set _tribeName = (_tribe and _tribe.name) ? _tribe.name : ($raidCtx.sourceTribeName ?? "Unknown")>>
<<set _tribeMil = Number((_tribe and _tribe.stats) ? (_tribe.stats.milStr ?? 0) : 0)>>
<<set _str = Number($strength ?? 0)>>
<<set _end = Number($endurance ?? 0)>>
<<set _pMil = Number($playerMilStr ?? 0)>>
/* Slightly higher base DC (since defended can swing it) */
<<set _baseDC = 20>>
<<set _roll = random(1, 20)>>
/* Defended advantage: big swing */
<<set _defBonus = (Number($defended ?? 0) >= 1) ? 6 : 0>>
/* Apply once */
<<if !$raidCtx.battleDone>>
<<set $raidCtx.battleDone = true>>
<<set _milBonus = Number($raidCtx.milBonus ?? 0)>>
<<set _dcMod = Number($raidCtx.dcMod ?? 0)>>
<<set _total = _str + _end + _pMil + _milBonus + _defBonus + _roll>>
<<set _target = _baseDC + _tribeMil + _dcMod>>
<<set _ok = _total >= _target>>
<<set _popGain = _ok ? random(1,2) : 0>>
<<set _stabDelta = _ok ? 3 : -4>>
<<set _zealDelta = _ok ? 2 : -3>>
/* Losses on defeat (percentage-based) */
<<set _foodLoss = _ok ? 0 : Math.floor(Number($food ?? 0) * 0.30)>>
<<set _resLoss = _ok ? 0 : Math.floor(Number($resources ?? 0) * 0.25)>>
<<set _goodLoss = _ok ? 0 : Math.floor(Number($goods ?? 0) * 0.20)>>
/* Population loss: percentage-based (with a safety cap to avoid runaway wipes) */
<<set _popLoss = 0>>
<<if !_ok>>
<<set _p = Number($pops ?? 0)>>
<<set _pct = random(8,12) / 100>> /* 8–12% */
<<set _popLoss = Math.max(1, Math.floor(_p * _pct))>>
<<set _popLoss = Math.min(_popLoss, 8)>> /* cap: tune if you want harsher/softer */
<<set _popLoss = Math.min(_popLoss, _p)>> /* never exceed current pops */
<</if>>
/* Apply player deltas */
<<set $stability = Number($stability ?? 0) + _stabDelta>>
<<set $zeal = Number($zeal ?? 0) + _zealDelta>>
<<if _ok>>
<<set $pops = Number($pops ?? 0) + _popGain>>
<<else>>
<<set $food = Math.max(0, Number($food ?? 0) - _foodLoss)>>
<<set $resources = Math.max(0, Number($resources ?? 0) - _resLoss)>>
<<set $goods = Math.max(0, Number($goods ?? 0) - _goodLoss)>>
<<set $pops = Math.max(0, Number($pops ?? 0) - _popLoss)>>
<</if>>
/* Enemy pop loss on player victory */
<<set _tribePopLoss = 0>>
<<if _ok and _tribe and _tribe.stats>>
<<set _tribePopLoss = random(1,2)>>
<<set _tribe.stats.population = Math.max(0, Number(_tribe.stats.population ?? 0) - _tribePopLoss)>>
<</if>>
/* NEW: On player defeat, redistribute stolen goods/resources/pops into the attacker */
<<set _tribePopGain = 0>>
<<set _tribeResGain = 0>>
<<set _popCasualties = 0>>
<<set _foodToRes = 0>>
<<if !_ok and _tribe and _tribe.stats>>
/* Tribe gains 70–80% of lost pops; rest are casualties */
<<set _share = random(70,80) / 100>>
<<set _tribePopGain = Math.floor(_popLoss * _share)>>
<<set _tribePopGain = Math.min(_tribePopGain, _popLoss)>>
<<set _popCasualties = _popLoss - _tribePopGain>>
<<set _tribe.stats.population = Math.max(0, Number(_tribe.stats.population ?? 0) + _tribePopGain)>>
/* Tribe has only stats.resources, so fold stolen resources+goods into that */
<<set _tribeResGain = _resLoss + _goodLoss>>
/* Optional: convert some stolen food into resources since tribes don't track food */
<<set _foodToRes = Math.floor(_foodLoss * 0.50)>>
<<set _tribeResGain = _tribeResGain + _foodToRes>>
<<set _tribe.stats.resources = Math.max(0, Number(_tribe.stats.resources ?? 0) + _tribeResGain)>>
/* Keep derived milStr consistent */
<<if setup.tribes and setup.tribes.recalcDerived>>
<<run setup.tribes.recalcDerived(_tribe)>>
<</if>>
<</if>>
/* Log */
<<set $raidCtx.log.battle = {
ok:_ok, baseDC:_baseDC, tribeMil:_tribeMil, dcMod:_dcMod,
milBonus:_milBonus, defBonus:_defBonus, roll:_roll, total:_total, target:_target,
popGain:_popGain, popLoss:_popLoss, tribePopLoss:_tribePopLoss,
tribePopGain:_tribePopGain, popCasualties:_popCasualties,
stabDelta:_stabDelta, zealDelta:_zealDelta,
foodLoss:_foodLoss, resLoss:_resLoss, goodsLoss:_goodLoss,
foodToRes:_foodToRes, tribeResGain:_tribeResGain
}>>
<<else>>
/* If already applied, ensure log exists so UI prints safely */
<<if !$raidCtx.log.battle>>
<<set $raidCtx.log.battle = {
ok:false, baseDC:_baseDC, tribeMil:_tribeMil, dcMod:0,
milBonus:0, defBonus:_defBonus, roll:0, total:0, target:0,
popGain:0, popLoss:0, tribePopLoss:0,
tribePopGain:0, popCasualties:0,
stabDelta:0, zealDelta:0,
foodLoss:0, resLoss:0, goodsLoss:0,
foodToRes:0, tribeResGain:0
}>>
<</if>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if _tribeName>>
<div>
<b><<print _tribeName>></b>
</div>
<br>
<</if>>
Fighting breaks out.
You only have one option.
<br>
<b>Destroy them.</b>
<div class="result-list">
<<if $raidCtx.log.battle.ok>>
<div class="result-line good">
<span class="label">Battle check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Battle check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print $raidCtx.log.battle.roll>></span>
</div>
<div class="result-line">
<span class="label">Str + End + Mil + bonuses + d20 vs DC</span>
<span class="value"><<print $raidCtx.log.battle.total>> / <<print $raidCtx.log.battle.target>></span>
</div>
<<if $raidCtx.log.battle.defBonus and $raidCtx.log.battle.defBonus > 0>>
<div class="result-line good">
<span class="label">Fortified camp</span>
<span class="value">+<<print $raidCtx.log.battle.defBonus>></span>
</div>
<</if>>
</div>
<<if $raidCtx.log.battle.ok>>
The world dissolves into a chaos of screams and splintering wood. You are at the heart of it, a whirlwind of controlled brutality, your every movement a lesson in violence. Your warriors, fueled by your resolve, follow your lead. The enemy's initial fury breaks against your tribe's unyielding defense, then shatters entirely under the weight of your counter-attack. They break, they run, they are cut down.
<br><br>
When the last foe falls, a silence descends, thick and heavy, broken only by the ragged breaths of the victorious. The fight is won.
The survivors stand amidst the fallen, their blood-slicked weapons held high. In this moment of brutal triumph, your tribe's spirit is reforged, its belief in your leadership cemented in blood and bone. The enemy is not just defeated; they are diminished, a warning carved into the memory of the land.
<br><br>
<b>Victory.</b>
<br><br>
<b>Gains</b>
<div class="result-list">
<div class="result-line good">
<span class="label">Population</span>
<span class="value">+<<print $raidCtx.log.battle.popGain>></span>
</div>
<div class="result-line good">
<span class="label">Stability</span>
<span class="value">+<<print $raidCtx.log.battle.stabDelta>></span>
</div>
<div class="result-line good">
<span class="label">Zeal</span>
<span class="value">+<<print $raidCtx.log.battle.zealDelta>></span>
</div>
<<if $raidCtx.log.battle.tribePopLoss > 0>>
<div class="result-line bad">
<span class="label">Enemy population</span>
<span class="value">-<<print $raidCtx.log.battle.tribePopLoss>></span>
</div>
<</if>>
</div>
<<else>>
The world dissolves into chaos, but the chaos finds you. A knot of seasoned raiders breaks from the main charge, their eyes fixed not on your warriors, but on you. They form a loose circle, a living cage of sharpened points.
<br><br>
They don't press for a killing blow. Instead, they use their reach, their spearpoints dancing just beyond your grasp. Each poke is a minor irritation, a pricking sting that barely breaks the skin, but it's enough. Enough to keep you at spear's length, turning your fury into a dance of frustration. You are a god of war trapped in a cage of thorns, forced to watch your people fall.
<br><br>
Through the gaps in their cruel circle, you see the horror unfold: your warriors being overwhelmed, the camp overrun, the screams of your people as they are cut down or dragged away into the dark. Your own strength becomes a cruel joke, a prison of combat that keeps you from saving those you lead.
<br><br>
With a final, furious lunge, you close the distance, and your weapon finds its home. The last of your tormentors falls.
<br><br>
But the camp is silent. The main force of raiders has already retreated, disappearing back into the woods with their spoils and their captives. You stand alone, chest heaving, among the bodies of your personal guard. You won your fight. You lost the battle.
<br><br>
<b>Defeat.</b>
<br><br>
<b>Losses</b>
<div class="result-list">
<div class="result-line bad">
<span class="label">Population</span>
<span class="value">-<<print $raidCtx.log.battle.popLoss>></span>
</div>
<div class="result-line bad">
<span class="label">Food</span>
<span class="value">-<<print $raidCtx.log.battle.foodLoss>></span>
</div>
<div class="result-line bad">
<span class="label">Resources</span>
<span class="value">-<<print $raidCtx.log.battle.resLoss>></span>
</div>
<div class="result-line bad">
<span class="label">Goods</span>
<span class="value">-<<print $raidCtx.log.battle.goodsLoss>></span>
</div>
<div class="result-line bad">
<span class="label">Stability</span>
<span class="value"><<print $raidCtx.log.battle.stabDelta>></span>
</div>
<div class="result-line bad">
<span class="label">Zeal</span>
<span class="value"><<print $raidCtx.log.battle.zealDelta>></span>
</div>
</div>
<br>
<b>Enemy gains</b>
<div class="result-list">
<<if $raidCtx.log.battle.tribePopGain > 0>>
<div class="result-line bad">
<span class="label">Captured population</span>
<span class="value">+<<print $raidCtx.log.battle.tribePopGain>></span>
</div>
<</if>>
<<if $raidCtx.log.battle.popCasualties > 0>>
<div class="result-line">
<span class="label">Casualties</span>
<span class="value"><<print $raidCtx.log.battle.popCasualties>></span>
</div>
<</if>>
<<if $raidCtx.log.battle.tribeResGain > 0>>
<div class="result-line bad">
<span class="label">Resources seized</span>
<span class="value">+<<print $raidCtx.log.battle.tribeResGain>></span>
</div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-num'>1</span><span class='choice-text'>End Event</span>">>
<<set $raidCtx._active = false>>
<<set $defended = 0>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
/* Ensure defaults exist */
<<set $raidCtx._active = $raidCtx._active ?? true>>
<<set $raidCtx.prepDone = $raidCtx.prepDone ?? false>>
<<set $raidCtx.milBonus = Number($raidCtx.milBonus ?? 0)>>
<<set $raidCtx.dcMod = Number($raidCtx.dcMod ?? 0)>>
/* Spark availability */
<<set _spark = setup.powerById("spark")>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 20) : 20)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
<<set _canSpark = _hasSpark and Number($belief ?? 0) >= _sparkCost>>
<</silently>>
''<div class="hub-textbox">
You have only moments to prepare. Choose your approach.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-num'>1</span><span class='choice-text'>Rouse your men! (Leadership)</span>">>
<<set $raidCtx.prepChoice = "leadership">>
<<goto "Event_Major_TribeRaid_DefendPrep_Resolve">>
<</button>>
<<button "<span class='choice-num'>2</span><span class='choice-text'>Show them the meaning of might! (Strength)</span>">>
<<set $raidCtx.prepChoice = "strength">>
<<goto "Event_Major_TribeRaid_DefendPrep_Resolve">>
<</button>>
<<if _canSpark>>
<<button "<span class='choice-num'>3</span><span class='choice-text'>Teach them the price of challenging the master of flame! (Belief) (Spark: <<print _sparkCost>> Belief)</span>">>
<<set $raidCtx.prepChoice = "spark">>
<<goto "Event_Major_TribeRaid_DefendPrep_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled" title="Requires Spark + enough Belief.">
<span class="choice-num">3</span>
<span class="choice-text">Teach them the price of challenging the master of flame! (Spark: <<print _sparkCost>> Belief)</span>
</span>
<</if>>
<<button "<span class='choice-num'>4</span><span class='choice-text'>No time for tricks (no check)</span>">>
<<set $raidCtx.prepChoice = "base">>
<<goto "Event_Major_TribeRaid_DefendPrep_Resolve">>
<</button>>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<set _choice = $raidCtx.prepChoice ?? "base">>
/* Refined DCs by approach */
<<set _dc = 18>>
<<if _choice is "leadership">>
<<set _dc = 10>>
<<elseif _choice is "strength">>
<<set _dc = 11>>
<</if>>
<<set _roll = random(1, 20)>>
/* Spark */
<<set _spark = setup.powerById("spark")>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 20) : 20)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
<<set _canSpark = _hasSpark and Number($belief ?? 0) >= _sparkCost>>
/* Apply once */
<<if !$raidCtx.prepDone>>
<<set $raidCtx.prepDone = true>>
<<set _ok = true>>
<<set _statKey = null>>
<<set _statVal = 0>>
<<set _note = "">>
<<if _choice is "leadership">>
<<set _statKey = "Leadership">>
<<set _statVal = Number($leadership ?? 0)>>
<<set _ok = (_statVal + _roll) >= _dc>>
<<if _ok>>
<<set $raidCtx.milBonus = Number($raidCtx.milBonus ?? 0) + 2>>
<<set _note =
"You weave through the line of your warriors, a current of certainty in a river of fear. You move not with a commander's shout, but with a predator's grace, close enough for your presence to be a bulwark against the rising tide of panic." +
"<br><br>" +
"A firm hand clamps down on a shoulder, stilling its tremor. A single name, spoken low and sharp, cuts through the cacophony of dread. A promise is made—not of easy survival, but of a price paid in enemy blood." +
"<br><br>" +
"You see it spread like fire. One by one, backs straighten, not as if pulled by a string, but as if forged anew. The fear in their eyes does not vanish, but it is reforged, tempered into a hard, cold focus." +
"<br><br>" +
"<b>Success:</b> your warriors rally (+2 Mil Str for this raid).">>
<<else>>
<<set $raidCtx.milBonus = Number($raidCtx.milBonus ?? 0) - 1>>
<<set _note =
"You weave through the line, your words a shield against the coming dread, but the shield is paper. A guttural roar, distant but growing, swallows your commands whole." +
"<br><br>" +
"Some men offer jerky, too-fast nods, their eyes wide with a terror they cannot hide. Others stare right through you, their heads cocked, already listening for the first shriek of steel or the first scream of a fallen comrade." +
"<br><br>" +
"Your voice reaches their ears, a fleeting sound, but it finds no purchase in their hearts. It is a shout in a hurricane, a spark in a downpour. The fear is a tide, and you have failed to turn it back." +
"<br><br>" +
"<b>Fail:</b> doubt spreads like a chill (-1 Mil Str for this raid).">>
<</if>>
<<elseif _choice is "strength">>
<<set _statKey = "Strength">>
<<set _statVal = Number($strength ?? 0)>>
<<set _ok = (_statVal + _roll) >= _dc>>
<<if _ok>>
<<set $raidCtx.dcMod = Number($raidCtx.dcMod ?? 0) - 2>>
<<set _note =
"You take a spear, its shaft familiar and cool in your palm. You test its balance once, a subtle shift of weight that feels like an extension of your arm." +
"<br><br>" +
"Then you throw—" +
"<br>" +
"not with the patient precision of a hunter, but with the sudden, violent fury of a storm breaking. Your body uncoils, a whipcrack of muscle and bone." +
"<br><br>" +
"The spear becomes a blur of dark wood, a keening whistle that slices through the tense silence. A sharp, wet cry is torn from the enemy's front line, followed by a choked gasp. Their charge falters, a ripple of hesitation spreading through their ranks as one of their own falls—" +
"<br>" +
"just enough." +
"<br><br>" +
"<b>Success:</b> you thin their front (next check easier).">>
<<else>>
<<set $raidCtx.dcMod = Number($raidCtx.dcMod ?? 0) + 1>>
<<set _note =
"You throw hard—too hard—" +
"<br>" +
"with anger where judgment should be." +
"<br><br>" +
"Spears bite dirt. Brush swallows them. The enemy does not slow." +
"<br><br>" +
"A few of your men glance at the empty hands, and you feel the moment tighten." +
"<br><br>" +
"<b>Fail:</b> you waste throws (next check harder).">>
<</if>>
<<elseif _choice is "spark">>
<<if _canSpark>>
<<set $belief = Number($belief ?? 0) - _sparkCost>>
<<set $raidCtx.dcMod = Number($raidCtx.dcMod ?? 0) - 4>>
<<set _ok = true>>
<<set _note =
"You draw the belief of your people, not into your lungs, but into your outstretched palm. It pools there, a cold and heavy weight, before it blossoms into a single, silent flame. It is a pale, silver fire that gives no heat, yet casts the world in sharp, stark relief. For a fleeting instant, your eyes reflect this light, the color swallowed by a pinpoint of terrifying, star-like brilliance." +
"<br><br>" +
"Then, with a sound like tearing silk, the main flame shatters. A dozen smaller embers break free, hovering for a moment before they streak across the distance. They move not like thrown things, but like thoughts given form—unerringly, unnaturally fast." +
"<br><br>" +
"They strike the front rank of the attackers. There is no explosion, no shout of pain. Instead, the embers seem to unfurl upon impact, and the men they touch are simply devoured. Silver fire engulfs them from head to toe in a single, silent heartbeat, turning them into living torches that collapse into ash before they can even scream." +
"<br><br>" +
"The charge breaks. The attackers halt, their faces masks of sheer, uncomprehending terror at a power that defies all reason.">>
<<else>>
<<set _choice = "base">>
<<set _ok = true>>
<<set _note =
"You reach for the Spark—" +
"<br>" +
"and touch nothing." +
"<br><br>" +
"No time to curse it. No time to mourn." +
"<br><br>" +
"You spit out a breath and go to work with what you have." +
"<br><br>" +
"You improvise.">>
<</if>>
<<else>>
<<set _ok = true>>
<<set _note =
"Plans are whispers in the dark; you choose the solid weight of your weapon." +
"<br><br>" +
"You abandon the pretense of strategy. There is no time. Your feet find purchase in the dirt, a rooted defiance against the coming tide. Your grip tightens on the familiar heft of wood and stone, a final comfort in the encroaching gloom. You fix your gaze on the pressing dark, a silent vow etched in your mind: they will bleed for this ground." +
"<br><br>" +
"There is no grand strategy, no clever feint. There is only the hard promise of the edge in your hand and the hot blood in your veins. Only speed. Only nerve.">>
<</if>>
<<set $raidCtx.log.prep = {
choice:_choice, dc:_dc, roll:_roll,
statKey:_statKey, statVal:_statVal, ok:_ok,
milBonus:Number($raidCtx.milBonus ?? 0),
dcMod:Number($raidCtx.dcMod ?? 0),
note:_note
}>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<print $raidCtx.log.prep.note>>
The air feels thinner now—like the camp is holding its breath with you.
<<if $raidCtx.log.prep.statKey>>
<<set _total = $raidCtx.log.prep.statVal + $raidCtx.log.prep.roll>>
<div class="result-list">
<<if $raidCtx.log.prep.ok>>
<div class="result-line good">
<span class="label"><<print $raidCtx.log.prep.statKey>> check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label"><<print $raidCtx.log.prep.statKey>> check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print $raidCtx.log.prep.statKey>> + d20 vs DC</span>
<span class="value"><<print _total>> / <<print $raidCtx.log.prep.dc>></span>
</div>
</div>
<</if>>
<<if $raidCtx.log.prep.choice is "spark">>
<br><br>
<div class="result-list">
<div class="result-line good">
<span class="label">Spark check</span>
<span class="value">SUCCESS</span>
</div>
</div>
<</if>>
<div class="result-list">
<div class="result-line">
<span class="label">Mil bonus (this raid)</span>
<span class="value"><<print ($raidCtx.log.prep.milBonus >= 0 ? "+" : "") + $raidCtx.log.prep.milBonus>></span>
</div>
<div class="result-line">
<span class="label">DC modifier (next check)</span>
<span class="value"><<print ($raidCtx.log.prep.dcMod >= 0 ? "+" : "") + $raidCtx.log.prep.dcMod>></span>
</div>
<<if $raidCtx.log.prep.choice is "spark">>
<div class="result-line bad">
<span class="label">Belief spent</span>
<span class="value">-<<print _sparkCost>></span>
</div>
<</if>>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-num'>1</span><span class='choice-text'>Fighting breaks out…</span>">>
<<goto "Event_Major_TribeRaid_Battle">>
<</button>>
</div><<silently>>
<<if !$raidCtx>><<set $raidCtx = {}>><</if>>
<<if !$raidCtx.log>><<set $raidCtx.log = {}>><</if>>
/* Apply once */
<<if !$raidCtx.retreatDone>>
<<set $raidCtx.retreatDone = true>>
/* Losses (tweak anytime) */
<<set _foodLoss = Math.floor(Number($food ?? 0) * 0.30)>>
<<set _resLoss = Math.floor(Number($resources ?? 0) * 0.25)>>
<<set _goodLoss = Math.floor(Number($goods ?? 0) * 0.20)>>
<<set $food = Math.max(0, Number($food ?? 0) - _foodLoss)>>
<<set $resources = Math.max(0, Number($resources ?? 0) - _resLoss)>>
<<set $goods = Math.max(0, Number($goods ?? 0) - _goodLoss)>>
<<set $raidCtx.retreatLosses = { food:_foodLoss, res:_resLoss, goods:_goodLoss }>>
<<set $raidCtx.log.retreat = $raidCtx.retreatLosses>>
<<else>>
/* If already applied, ensure losses object exists for display */
<<if !$raidCtx.retreatLosses>>
<<set $raidCtx.retreatLosses = ($raidCtx.log and $raidCtx.log.retreat) ? $raidCtx.log.retreat : { food:0, res:0, goods:0 }>>
<</if>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You order a retreat into the woods. Your people melt into cover. Whether it was a move made out of cowardice, care for your people, or as a tactical decision, only you know. In the end, the only thing that's certain is that, while unharmed, your tribe has come out poorer due to your decision.
<br><br>
<b>Retreat losses</b>
<div class="result-list">
<div class="result-line bad">
<span class="label">Food</span>
<span class="value">-<<print $raidCtx.retreatLosses.food>></span>
</div>
<div class="result-line bad">
<span class="label">Resources</span>
<span class="value">-<<print $raidCtx.retreatLosses.res>></span>
</div>
<div class="result-line bad">
<span class="label">Goods</span>
<span class="value">-<<print $raidCtx.retreatLosses.goods>></span>
</div>
<div class="result-line good">
<span class="label">Casualties</span>
<span class="value">None</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-num'>1</span><span class='choice-text'>End Event</span>">>
<<set $raidCtx._active = false>>
<<set $defended = 0>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
/* Resolve tribe */
<<set _tribe = null>>
<<set _tid = _ev ? (_ev.sourceTribeId ?? _ev.sourceTribeID ?? _ev.tribeId) : null>>
<<if $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is String(_tid)>>
<<set _tribe = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _met = false>>
<<if _tribe>>
<<set _met = (!!_tribe.contacted) or (!!($metTribeIds and $metTribeIds[_tribe.id]))>>
<</if>>
/* Trade state */
<<if _entry and !_entry.tradeState>>
<<set _entry.tradeState = {
choice: null,
applied: false,
log: {}
}>>
<</if>>
/* Power option: Sway */
<<set _sway = setup.powerById("sway")>>
<<set _swayCost = Number(_sway ? (_sway.cost ?? 35) : 35)>>
<<set _hasSway = !!($powersOwned && $powersOwned.sway)>>
<<set _canSway = _hasSway and Number($belief ?? 0) >= _swayCost>>
<</silently>>
''<div class="hub-textbox">
<<if _met and _tribe>>
<div>
<b><<print _tribe.name>></b>
</div>
Familiar figures emerge from the treeline, their forms stark against the shadows. It is the <<print _tribe.name>>. They move with a wary calm, a silence that speaks of past troubles and a hope for present profit.
<br><br>
They lay out their wares—carved bone, preserved hides, rare herbs—on a spread hide between the camps. Their gazes are sharp, missing nothing, constantly flicking from your face to your hands, to the weapons of your warriors who stand watch. The air is taut, stretched thin. A single harsh word, a gesture too quick, and this barter becomes a bloodletting. This is a test of nerve as much as a trade of value.
<<else>>
Figures drift from the treeline, not with the aggression of raiders, but with the slow, deliberate caution of predators testing a new territory. They are strangers, their faces unfamiliar, their bearing taut with a nervous energy. They carry bundles of strange make, and their eyes, though fixed on you, constantly dart towards the weapons of your warriors.
<br><br>
They seem more interested in the weight of coin than the weight of a spear... for now. The unspoken "for now" hangs in the air between you, a palpable threat.
<br><br>
They lay out their wares—objects of carved wood and woven reed, unfamiliar and alien in the morning light. Their hands move with practiced care, but their eyes never stop their assessment, watching your face for a flicker of emotion, your hands for the slightest hint of betrayal. A single harsh word, a gesture too quick, and this quiet barter could shatter into a test of nerves, where value is measured in blood.
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-num'>1</span><span class='choice-text'>Negotiate carefully (Stewardship)</span>">>
<<set _entry.tradeState.choice = "stew">>
<<goto "Event_Major_TribeTrade_Resolve">>
<</button>>
<<button "<span class='choice-num'>2</span><span class='choice-text'>Win them over (Charisma)</span>">>
<<set _entry.tradeState.choice = "cha">>
<<goto "Event_Major_TribeTrade_Resolve">>
<</button>>
<<if _canSway>>
<<button "<span class='choice-num'>3</span><span class='choice-text'>Let power bleed into your words, a subtle fire that warms them to your way of thinking. (Sway: <<print _swayCost>> Belief)</span>">>
<<set _entry.tradeState.choice = "sway">>
<<goto "Event_Major_TribeTrade_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled"
title="<<print _hasSway ? ('Need ' + _swayCost + ' Belief.') : 'You have not acquired Sway.'>>">
<span class="choice-num">3</span>
<span class="choice-text">Let power bleed into your words, a subtle fire that warms them to your way of thinking. (Sway: <<print _swayCost>> Belief)</span>
</span>
<</if>>
<<button "<span class='choice-num'>4</span><span class='choice-text'>A simple exchange (no check)</span>">>
<<set _entry.tradeState.choice = "base">>
<<goto "Event_Major_TribeTrade_Resolve">>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<<set _st = _entry ? _entry.tradeState : null>>
<<set _choice = _st ? (_st.choice ?? "base") : "base">>
/* Resolve tribe again */
<<set _tribe = null>>
<<set _tid = _ev ? (_ev.sourceTribeId ?? _ev.sourceTribeID ?? _ev.tribeId) : null>>
<<if $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is String(_tid)>>
<<set _tribe = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Power: Sway (for resolve) */
<<set _sway = setup.powerById("sway")>>
<<set _swayCost = Number(_sway ? (_sway.cost ?? 35) : 35)>>
<<set _hasSway = !!($powersOwned && $powersOwned.sway)>>
<<set _canSway = _hasSway and Number($belief ?? 0) >= _swayCost>>
/* Tunables */
<<set _dc = 15>>
<<set _roll = random(1, 20)>>
<<if _choice is "stew">>
<<set _dc = 14>>
<<elseif _choice is "cha">>
<<set _dc = 12>>
<</if>>
/* Baseline rewards */
<<set _foodBase = 46>>
<<set _goodsBase = 3>>
/* One-time apply */
<<if _entry and _st and !_st.applied>>
<<set _st.applied = true>>
<<set _ok = true>>
<<set _statKey = null>>
<<set _statVal = 0>>
<<set _foodGain = _foodBase>>
<<set _goodsGain = _goodsBase>>
/* Defaults per your table */
<<set _relDelta = 1>>
<<set _moodDelta = 0>>
<<set _tribeResGain = 21>>
<<set _popGain = 0>>
<<set _tribePopLoss = 0>>
<<if _choice is "stew">>
<<set _statKey = "Stewardship">>
<<set _statVal = Number($stewardship ?? 0)>>
<<set _ok = (_statVal + _roll) >= _dc>>
<<if _ok>>
<<set _foodGain = 76>>
<<set _goodsGain = 5>>
<<set _relDelta = 2>>
<<set _moodDelta = 2>>
<<set _tribeResGain = 12>>
<<else>>
/* Reduced (but still positive) outcome */
<<set _foodGain = 27>>
<<set _goodsGain = 1>>
/* keep defaults: rel +1, tribeRes +21 */
<</if>>
<<elseif _choice is "cha">>
<<set _statKey = "Charisma">>
<<set _statVal = Number($charisma ?? 0)>>
<<set _ok = (_statVal + _roll) >= _dc>>
<<if _ok>>
<<set _foodGain = 62>>
<<set _goodsGain = 3>>
<<set _popGain = 1>>
<<set _tribePopLoss = 1>>
<<set _relDelta = 5>>
/* keep defaults: mood 0, tribeRes +21 */
<<else>>
<<set _foodGain = 30>>
<<set _goodsGain = 3>>
<<set _relDelta = -1>>
/* keep defaults: mood 0, tribeRes +21 */
<</if>>
<<elseif _choice is "sway">>
/* Safety: if something calls resolve without paying, don't apply Sway benefits */
<<if _canSway>>
<<set $belief = Math.max(0, Number($belief ?? 0) - _swayCost)>>
<<set _ok = true>>
<<set _statKey = "Sway">>
<<set _foodGain = 95>>
<<set _goodsGain = 6>>
<<set _relDelta = 8>>
<<set _moodDelta = 1>>
<<set _tribeResGain = -10>>
<<else>>
/* Fallback to base trade if Sway isn't actually available */
<<set _choice = "base">>
<<set _ok = true>>
<<set _statKey = null>>
<<set _foodGain = _foodBase>>
<<set _goodsGain = _goodsBase>>
<<set _relDelta = 1>>
<<set _moodDelta = 0>>
<<set _tribeResGain = 21>>
<</if>>
<<else>>
<<set _foodGain = _foodBase>>
<<set _goodsGain = _goodsBase>>
<<set _ok = true>>
<<set _relDelta = 1>>
<<set _moodDelta = 0>>
<<set _tribeResGain = 21>>
<</if>>
/* Apply player deltas (clamped to avoid negatives) */
<<set $food = Math.max(0, Number($food ?? 0) + _foodGain)>>
<<set $goods = Math.max(0, Number($goods ?? 0) + _goodsGain)>>
<<if _popGain > 0>>
<<set $pops = Number($pops ?? 0) + _popGain>>
<</if>>
<<if _tribe>>
<<set _tribe.relations = Number(_tribe.relations ?? 0) + _relDelta>>
<<set _tribe.mood = Number(_tribe.mood ?? 0) + _moodDelta>>
<<if _tribe.stats and _tribeResGain != 0>>
<<set _tribe.stats.resources = Math.max(0, Number(_tribe.stats.resources ?? 0) + _tribeResGain)>>
<</if>>
<<if _tribe.stats and _tribePopLoss > 0>>
<<set _tribe.stats.population = Math.max(0, Number(_tribe.stats.population ?? 0) - _tribePopLoss)>>
<</if>>
<</if>>
<<set _st.log = {
choice:_choice,
dc:_dc,
roll:_roll,
statKey:_statKey,
statVal:_statVal,
ok:_ok,
foodGain:_foodGain,
goodsGain:_goodsGain,
popGain:_popGain,
tribePopLoss:_tribePopLoss,
relDelta:_relDelta,
moodDelta:_moodDelta,
tribeResGain:_tribeResGain,
swayCost:(_choice is "sway" ? _swayCost : 0)
}>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if _tribe and _tribe.name>>
<div>
<b><<print _tribe.name>></b>
</div><br>
<</if>>
<!-- Show check results OR Sway invoke line -->
<<if _st and _st.log and _st.log.statKey>>
<<if _st.log.statKey is "Sway">>
<div class="result-list">
<div class="result-line good">
<span class="label">Power</span>
<span class="value">SWAY</span>
</div>
<div class="result-line">
<span class="label">Belief spent</span>
<span class="value">-<<print _st.log.swayCost>></span>
</div>
</div>
<br><br>
<<else>>
<<set _total = _st.log.statVal + _st.log.roll>>
<div class="result-list">
<<if _st.log.ok>>
<div class="result-line good">
<span class="label"><<print _st.log.statKey>> check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label"><<print _st.log.statKey>> check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _st.log.roll>></span>
</div>
<div class="result-line">
<span class="label"><<print _st.log.statKey>> + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _st.log.dc>></span>
</div>
</div>
<br><br>
<</if>>
<</if>>
<<if _st and _st.log>>
<<if _st.log.choice is "stew">>
<<if _st.log.ok>>
Patience is a language you speak fluently. You stand rooted, letting the silence hang in the air, a testament to your control. You watch as they lay out their goods, your eyes missing nothing, cataloging each item not with greed, but with the dispassionate precision of a master craftsman examining raw materials.
<br><br>
When the last hide is unfurled, you move forward. There is no wasted motion.
Your gaze performs a silent, lightning-fast inventory, a count so subtle it is barely a flicker of your eyelids. You do not grope or fumble.
Your hands move with purpose, touching only what must be touched: testing the weave of a basket, feeling the heft of a stone axe head, checking the cure on a strip of leather. Each touch is a quiet interrogation, and the goods give up their secrets to your experienced fingers.
<br><br>
Your voice, when it comes, is neither loud nor aggressive. It is a calm river of fact. A quiet word about a weakened seam. A small gesture to a hairline fracture in a pot. Your counters are not haggling; they are simple, undeniable truths that adjust the value of their wares.
<br><br>
The lead trader, a woman whose eyes have seen a dozen seasons of hard bargaining, watches you. Her initial wariness melts away, replaced by a grudging respect. She sees she is facing not a chieftain to be bluffed, but a true steward of value. She holds your gaze for a long, measured moment, then gives a single, slow nod of acceptance.
<br><br>
The deal settles into place not with a handshake, but with a shared understanding. It feels like a heavy stone sinking into deep mud, its final position absolute, its weight impossible to dispute. The bargain is struck, and it is ironclad.
<<else>>
You try to keep it clean—numbers, measures, fairness. Your mind is a ledger, and you intend to balance it perfectly.
<br><br>
Your eye catches on a particular item: a bundle of herbs, vibrant and green, or a hide with a pattern that seems to shimmer in the light. It seems a prize beyond measure, a rare find that could elevate your tribe's status. You anchor the entire trade around this one jewel, conceding value elsewhere to secure it, feeling a surge of triumph as the deal is struck.
<br><br>
Only as they are packing up, as you run a thumb over the surface again in the quiet aftermath, do you notice it. The faint scent of dust, not potency, from the herbs. The brittle feel to the hide that speaks of a poor cure, not a rare one. The initial excitement had blinded you, and you saw only what you wanted to see.
<br><br>
The deal is already done. The words spoken. You look up, but the traders are already shouldering their remaining goods. You catch the lead trader's eye. There is no smirk of deception, only a flat, knowing look. The look one gives a child who has just learned a hard lesson about the world. They didn't trick you; you tricked yourself.
<br><br>
You are left with your prize, its true, lesser value now glaringly obvious. The shame of your own miscalculation burns sharper than any flame.
<</if>>
<<elseif _st.log.choice is "cha">>
<<if _st.log.ok>>
You don't trade only in goods, but in something far more valuable: goodwill. Your voice is a calm current cutting through the tense silence, each word chosen not for its meaning, but for its tone. It is the sound of a stream, not a waterfall.
<br><br>
You offer a shared laugh at a mishap—a dropped bundle of furs—that is not a baring of teeth, but a moment of simple, clumsy humanity. You tell a brief, self-deprecating story of a hunt gone awry, a tale that makes you not a chieftain to be feared, but a person to be understood. It is a bridge built of nothing but words, and you see them cross it, one by one.
<br><br>
The suspicion in their eyes doesn't vanish, but it ebbs. Shoulders, once tight with readiness for a fight, slump slightly. Hands that rested on knife hilts now hang loose at their sides. The space between the two groups feels less like a battleground and more like a shared patch of neutral ground.
<br><br>
One of them, a younger individual with eyes that hold more weariness than malice, lingers at the edge of the group. Their gaze keeps flicking past you, drawn to the heart of your camp. To the crackling fire, a beacon of warmth against the encroaching dusk. To the familiar sounds of your people, a promise of community, of safety.
<br><br>
When the trade is concluded and the others begin to gather their things, there is a pause. The main group turns to leave, but one does not. One takes a hesitant step closer to the fire, their choice made in the heavy silence. One stays.
<<else>>
You try to make them like you.
<br><br>
It comes out wrong—your smile too eager, your gestures too sharp, your confidence a bludgeon. You point to a fine hide, intending praise, but the motion is dismissive, a backhanded compliment that speaks louder than any words.
<br><br>
They smile, but it's the kind of smile that counts weaknesses. You see them exchange a look—a flicker of an eyelash, a subtle tilt of the head—that speaks volumes. They have found your weakness: you are trying too hard.
<br><br>
Their lead trader meets your offers with a polite nod, their expression a wall of civility. They never raise their voice, but the air between you grows thick and cold, turning to ice. The negotiation is over before it began. They accept your terms with a swift, final movement, not because the deal is fair, but because the cost of your company is higher than any price.
<br><br>
The trade finishes fast.
<br><br>
They gather their things like men who plan not to be here long.
<</if>>
<<elseif _st.log.choice is "sway">>
You let the moment hang, allowing the silence to settle.
<br><br>
Then, you reach for the quiet certainty in your own chest and let it bleed into the air around you. It isn't a command, but a suggestion—a feeling of ease that settles over them like a warm sun on a cold day. You aren't forcing their thoughts, only gently nudging their emotions, making the path of trust feel like the most natural one to walk.
<br><br>
The lead trader, who was about to make a hard counter-offer, finds the words catching in their throat. The sharp edge of their suspicion blunts, not vanishing, but losing its point. The tension in their shoulders uncoils with a slow, almost imperceptible release. The negotiation flows from that point on, not because they are compelled, but because the very idea of conflict feels distant and unnecessary.
<br><br>
They leave with a faint sense of puzzlement, like they've forgotten a worry they knew they had just moments ago, unable to recall exactly what it was that seemed so important.
<<else>>
There is no dance of words, no performance of friendship. Today is not a day for pride, but for simple necessity.
<br><br>
You point to a bundle of hides; they gesture to a pile of herbs. A nod confirms the exchange. It is barter in its rawest form: hands, goods, and the hard, quiet understanding that any sudden move will be the last one.
<br><br>
You keep your eyes on theirs, and they do the same, a mutual, unblinking caution that is the only trust either side is willing to offer.
<</if>>
<<else>>
You complete the trade.
<</if>>
<br><br>
<b>You gain</b>
<div class="result-list">
<div class="result-line good">
<span class="label">Food</span>
<span class="value"><<print (_st.log.foodGain >= 0 ? "+" : "") + _st.log.foodGain>></span>
</div>
<div class="result-line good">
<span class="label">Goods</span>
<span class="value"><<print (_st.log.goodsGain >= 0 ? "+" : "") + _st.log.goodsGain>></span>
</div>
<<if _st.log.popGain > 0>>
<div class="result-line good">
<span class="label">Population</span>
<span class="value">+<<print _st.log.popGain>></span>
</div>
<</if>>
</div>
<<if _tribe>>
<br><br>
<b>Effects on the other tribe</b>
<div class="result-list">
<div class="result-line">
<span class="label">Relations</span>
<span class="value"><<print (_st.log.relDelta >= 0 ? "+" : "") + _st.log.relDelta>></span>
</div>
<<if _st.log.moodDelta != 0>>
<div class="result-line">
<span class="label">Mood</span>
<span class="value"><<print (_st.log.moodDelta >= 0 ? "+" : "") + _st.log.moodDelta>></span>
</div>
<</if>>
<<if _tribe.stats and _st.log.tribeResGain != 0>>
<div class="result-line">
<span class="label">They gain resources</span>
<span class="value"><<print (_st.log.tribeResGain >= 0 ? "+" : "") + _st.log.tribeResGain>></span>
</div>
<</if>>
<<if _st.log.tribePopLoss > 0>>
<div class="result-line bad">
<span class="label">They lose population</span>
<span class="value">-<<print _st.log.tribePopLoss>></span>
</div>
<</if>>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-num'>1</span><span class='choice-text'>End Event</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
<</silently>>
''<div class="hub-textbox">
For a long while now, your people have endured without fracturing.
Disputes are spoken aloud, not whispered. Old grievances are carried openly, not sharpened in the dark. When decisions are made, they are followed—not because all agree, but because all still believe in the whole.
There is a sense among the camp that the story has found its spine.
Children repeat the same tales around different fires and somehow tell them the same way. Elders argue, but they do not undermine. Even faith—restless as it is—moves in the same direction.
Unity is not forced.
It simply holds. And you are its pillar
</div>''
<div class="hub-buttons">
<<button "End Event">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _kaelPresent = false>>
<<if $campNpcs and $campNpcs.length>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<if $campNpcs[_i] and $campNpcs[_i].id is "npc_kael">>
<<set _kaelPresent = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<</silently>>''<div class="hub-textbox">
It has been a few days since you brought the wildling back to camp.
For most of that time she has remained half-conscious at best, burning with fever and too weak to do much more than glare whenever you enter the tent.
Today is different.
A harsh cry cuts through the camp, followed by the sounds of a struggle.
When you reach the tent, one of your hunters is trying to keep the wildling from slipping past him. She is weak, feverish, and still she fights like something cornered, teeth bared and hands clawing for even the smallest opening.
<<if _kaelPresent>>
Kael stands nearby with his arms crossed, watching the scene with a calm that only makes the chaos around him seem louder.
"Third time today," he says, tipping his head toward the tent flap. "She still wants out more than she wants sense. And from the look of her, the fever has not broken either."
<</if>>
You step in before the whole thing turns into a spectacle.
The wildling twists and thrashes when you take hold of her, but once she realizes it is you, some of the blind violence leaves her. Not trust. Not surrender. Just enough recognition for you to force the situation back under control and shove her into the tent once more.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Follow her inside</span>">>
<<goto "Event_Major_WildHeart_1">>
<</button>>
</div>''<div class="hub-textbox">
Once you have her inside, you finally notice how hot her skin is beneath your grip. Whatever fury keeps her moving, the fever has not loosened its hold.
You signal the guard to fetch Old Morag.
Only after he hurries off do you let the wildling pull free of you. She stumbles back several steps and raises her arms defensively, though the heavy way she breathes makes it clear that, right now, the gesture is more pride than threat.
You raise your own hands slowly in answer.
It works, at least enough to keep her from lunging again.
Instead she begins signing sharply at you, each movement full of strain and anger. Even so, the meaning is plain enough.
"I. Want. Out."
You look at her for a moment, then shake your head.
Whatever else this is, letting her stagger back into the wild like this would be little different from leaving her to die.
Her eyes widen for an instant, perhaps because you understood her at all.
Then they narrow.
And just as it seems she is about to launch into another furious exchange, someone steps through the flap behind you.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Another person enters the tent</span>">>
<<goto "Event_Major_WildHeart_2">>
<</button>>
</div><<silently>><<run setup.wildHeart.createLakeQuest()>><<run setup.wildHeart.enablePoulticeRecipe()>><</silently>>''<div class="hub-textbox">
A small, frail-looking woman enters the tent with an unhurried, almost casual stride.
Old Morag.
She gives the wildling one look, then you another, and lets out a dry little sound that might be amusement.
"Livelier than yesterday," she says. "Good. That means the spirits have not finished fighting over her yet."
The wildling does not seem to appreciate this verdict. She tenses at once, ready to resist even now.
Morag waves two fingers in her direction.
"Hold her still."
You do.
There is struggle, of course. The wildling twists and nearly slips free once, but in the end Morag presses a palm to her brow, studies her eyes, and listens to her breathing with the calm patience of someone examining bad weather.
At last the old woman straightens and grunts.
"Not a simple wound-fever. Something clings to her."
She explains, in the matter-of-fact tone she uses for births, deaths, and everything in between, that she may still be able to drive it out.
For now, though, there is nothing more to be done inside this tent tonight.
When she leaves, the wildling sags back onto the furs, breathing hard but still watching you with the same stubborn fire in her eyes.
<div class="result-line good">
<span class="label">New Task added</span>
<span class="value">Still Water Roots</span>
</div>
<div class="result-line good">
<span class="label">Recipe unlocked</span>
<span class="value">Wildling Poultice</span>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Leave the tent for now</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<set $questFlags.q_wildling_bath_intro = true>>
<</silently>>''<div class="hub-textbox">
Morag stops you near the edge of camp while you are giving instructions to one of the women on how to prepare cloth for winter. A moment later, you feel a stick strike your shin. Turning, you find Morag casually jabbing you to get your attention.
“The girl is healing,” she says, jerking her chin toward the wildling’s tent. “But... ugh, for spirits’ sake, the girl needs a bath! She smells like a bog-rotten hide, and she barely even lets me approach her!”
She sighs and clicks her teeth.
“So, Chieftain, take care of it. I’m already losing my sight. I don’t need to lose my sense of smell as well. That’s how I tell the herbs apart.”
She says it while already turning to head elsewhere.
“Besides, you’re the only one who seems able to understand her gibberish anyway. Maybe you can even explain to her that she smells like an old carcass wrapped in moss!”
With that, she stomps off, clearly expecting you to deal with it.
For your part, you decide to see the problem for yourself once you are finished.
Up close, the smell is worse than before. It is no longer just the rank stench of someone half-dead from fever, but old sweat, matted filth, and the sour edge of wounds left too long without proper cleaning. Beneath the layers of grime, several scratches along her arms and side have reddened and swollen.
Even you cannot help but wrinkle your nose. You are not sure whether your heightened senses make it better or worse.
She glances at you as you enter, only mildly interested, and continues carving something into the floor with one of the knives she seems to have snatched from your hunters.
You approach her casually, take the knife from her hand, and then, with your other hand, point toward the tent flap. She understands you perfectly despite her lack of language, in that strange way she seems able to understand only you.
Outside. Bath. Now.
At the word, the wildling goes rigid.
Her head snaps first toward Morag, then back to you. Her breathing quickens. When you gesture gently toward the spring outside camp, panic flashes across her face so naked and immediate that it jars you more than any snarl ever has.
She backs away at once, eyes wide, as though the very thought of deep water is worse than pain.
Morag watches her for a moment, then sighs.
“There’s something there,” the old woman mutters. “Maybe memory. Maybe fear. Doesn’t matter. She still needs it done.”
That much is clear enough.
Getting her to the spring without turning the whole thing into another struggle will be the hard part.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Force the issue</span>">>
<<goto "Event_Major_WildlingBath_Force">>
<</button>>
<<button "<span class='choice-text'>Try being patient</span>">>
<<goto "Event_Major_WildlingBath_Patient">>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<run (function () {
try {
if (document.body) {
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
}
} catch (e) {}
})()>>
<<if not $questFlags.q_wildling_bath_force_done>>
<<set $questFlags.q_wildling_bath_force_done = true>>
<<set $questFlags.q_wildling_bath_done = true>>
<</if>>
<</silently>>''<div class="hub-textbox">
<<run (function () {
const w = setup.people.upsert("npc_wildling", {});
w.love = Number(w.love ?? w.trust ?? 0) - 10;
w.obedience = Number(w.obedience ?? w.influence ?? 0) + 10;
})();>>
You dont have time for this. at least not any you are willing to spare. You go towards her, and grab her, perhaps a bit roughly, before throwing her over your shoulder and carrying her to the spring.
You rip off her clothes when you get there
You enter the water while holding her naked body as you begin to clean her
<<nsfwimg "images/events/bath/bathAlt.webm">>
She goes rigid the moment the warmth touches her skin. Her legs kick weakly, more out of principle than any real attempt to escape. You hold her firm against your chest with one arm while the other works Morag's herbal paste across her body.
The grime comes away in dark clouds. You scrub her arms first, then her ribs, then the infected scratches along her side that have gone too long without care. She makes sharp sounds of protest when your fingers pass over the swollen edges of the wounds. Her body stays tense as a bowstring.
You work quickly. No tenderness. No soothing sounds. Just efficient movement, cleaning what needs to be cleaned so the wounds do not fester. Your hand passes between her legs once, twice, removing the accumulated filth there. She jerks at the contact but does not bite again.
When you finish, you release her.
She tears herself from your grip instantly, water churning around her as she puts distance between you. Three long strides backward until her shoulders press against the far rocks. Her chest heaves. Her eyes burn with something too sharp and proud to be called fear.
Fury. Pure and undiluted.
You meet her glare without flinching. Gesture once toward camp. The meaning is clear enough.
Done. Going back.
She does not follow you out of the water. She stays where she is, naked and dripping, watching you retrieve your clothes with the stare of an animal that has been cornered and remembers it.
You sigh, as you dress and then pick her up again.
Morag finds you an hour later and sniffs the air near your shoulder.
"She smells better," the old woman says. Her nose wrinkles. "You smell like you wrestled a boar into a mud pit."
You shurg at her statement as you set the wriggling wildling down.
Morag cackles and waves you off toward your next task.
That evening, you catch the wildling watching you. The look she gives you is not friendly. She holds it for a long moment, then turns away and disappears.
Something has shifted between you. The balance is different now. She knows you can force her when you choose. You know she will make you work for every inch of compliance.
<div class="result-list">
<div class="result-line good">
<span class="label">Effect</span>
<span class="value">The wildling is cleaned</span>
</div>
<div class="result-line bad">
<span class="label">Love</span>
<span class="value">-10</span>
</div>
<div class="result-line good">
<span class="label">Obedience</span>
<span class="value">+10</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Leave her to cool off</span>">>
<<run (function () {
try {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack("stars");
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr && typeof tr.stop === "function") tr.stop();
}
if (State && State.variables && State.variables.musicState && String(State.variables.musicState.track || "") === "stars") {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set _bathEnduranceNeed = 5>>
<<set _bathEndurance = Number($endurance ?? 0)>>
<<set _bathEnduranceOk = (_bathEndurance >= _bathEnduranceNeed)>>
<<run (function () {
try {
if (document.body) {
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
}
} catch (e) {}
})()>>
<</silently>>''<div class="hub-textbox">
…Well, you say patience, but you do not think patience alone will be enough.
So you cross the tent in a few easy steps, and before she can properly react, you catch her and haul her up over your shoulder.
She jerks in surprise, then immediately begins to thrash, twisting and kicking with all the furious strength of a trapped animal. Her fists beat against your back. Her body writhes in your grip. A moment later, sharp pain flashes through your side as she bites you.
<div class="result-list result-list-check">
<div class="result-line <<if _bathEnduranceOk>>good<<else>>bad<</if>>">
<span class="label">Endurance threshold</span>
<span class="value"><<if _bathEnduranceOk>>PASSED<<else>>FAILED<</if>></span>
</div>
<div class="result-line">
<span class="label">Endurance needed</span>
<span class="value"><<print _bathEnduranceNeed>></span>
</div>
<div class="result-line">
<span class="label">Your Endurance</span>
<span class="value"><<print _bathEndurance>></span>
</div>
</div>
<<if _bathEnduranceOk>>
You barely react. You keep walking as if she has done little more than test you.
<<else>>
You wince hard enough for her to feel it, then give her a firm shake until she lets go. After that, you keep walking.
<</if>>
Ignoring the stares of anyone who notices, you carry her through camp and toward the spring.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Carry her to the spring</span>">>
<<goto "Event_Major_WildlingBath_Patient_1">>
<</button>>
</div><<silently>>
<<run (function () {
try {
if (document.body) {
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
}
} catch (e) {}
})()>>
<<run setup.playStars ? setup.playStars() : (function () {
try {
if (setup.stopAllAudio) setup.stopAllAudio();
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr) {
tr.loop(true);
tr.volume((setup.audio && setup.audio.getMusicVolume01) ? setup.audio.getMusicVolume01() : ((settings.masterVolume ?? 10) / 10));
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
}
if (State && State.variables) {
State.variables.musicState = State.variables.musicState || { playing:false, track:"", source:"" };
State.variables.musicState.playing = true;
State.variables.musicState.track = "stars";
State.variables.musicState.source = "scene";
State.variables.introActive = false;
State.variables.mainThemeActive = false;
State.variables.battleActive = false;
}
} catch (e) {}
})()>>
<</silently>>''<div class="hub-textbox">
When you arrive, you set her down on a broad stone near the water’s edge without ceremony.
For a moment, she looks ready to run.
But then you turn your back on her and begin to undress, as if you do not consider flight a real possibility.
That, more than anything, seems to catch her attention.
You can feel her stare on you as you strip off the last of your clothes. Suspicious. Narrow-eyed. Uncertain. Her gaze travels over your <<if $height < 160>>small<<elseif $height > 220>>humongous<<elseif $height > 190>>large<<else>>normal<</if>> frame, not trusting you enough to relax, but too curious to look away either.
You do not acknowledge it.
Instead, you step into the spring.
One step. Then another.
The water climbs slowly up your legs, then your waist, until half your body is submerged. Ripples spread softly around you as you move deeper, then settle again. At last, you find a place to sit and lower yourself into it with deliberate ease, stretching out as though this had been your purpose all along.
You lean back, tilt your head toward the treeline, and let out a long, exaggerated sigh of relief.
Still, you do not look at her.
You simply sit there in the water, loose and unbothered, leaving the silence to work on her.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Wait and let her watch</span>">>
<<goto "Event_Major_WildlingBath_Patient_2">>
<</button>>
</div><<silently>>
<<run (function () {
try {
if (!document.body) return;
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
window.setTimeout(function () {
try {
if (!document.body) return;
document.body.classList.add("wildling-bath-fade");
void document.body.offsetWidth;
window.setTimeout(function () {
try {
if (document.body) document.body.classList.add("wildling-bath-blackout");
} catch (e) {}
}, 40);
} catch (e) {}
}, 40);
} catch (e) {}
})()>>
<</silently>>''<div class="hub-textbox">
For a while nothing happens, but still you persist, if thats the right word.
In fact, you come to actually start relaxing as you close your eyes, head still turned upward.
A few moment pass in silence. Then you hear a rustle, and another one. Then silence again. Befoer you finally open your eyes again
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Open your eyes</span>">>
<<goto "Event_Major_WildlingBath_Patient_3">>
<</button>>
</div><<silently>>
<<run (function () {
try {
if (!document.body) return;
document.body.classList.add("wildling-bath-fade", "wildling-bath-blackout");
window.setTimeout(function () {
try {
if (document.body) document.body.classList.remove("wildling-bath-blackout");
} catch (e) {}
}, 60);
} catch (e) {}
})()>>
<</silently>>''<div class="hub-textbox">
<img src="images/events/bath/look.png" alt="Amogus">
What you see before you is the wildling crouched above you, knees pressed together, her head tilted as she studies you with open curiosity.
You keep your expression neutral. Then, slowly, you lift one hand from the water and give her a thumbs-up.
You are not entirely sure why you use that gesture. It has no meaning here beyond the one you have just chosen to give it. And yet, as always, the woman seems to understand you perfectly.
Feels good.
You watch the conflict play across her face. Suspicion first, sharp and immediate at your bold, wordless claim. Then a snarl.
The meaning is easy enough to read.
Liar.
You only shrug.
That meaning reaches her even faster.
Coward.
That seems to frustrate her. She suddenly rises and begins making a flurry of sharp hand gestures, mixed with disconnected sounds and annoyed little snarls. You watch, only mildly amused.
Then, suddenly—
She turns toward the water. Befpre quickly tearing off the little clothes she is wearing, imitating what you did earlier.
She takes a deep breath, perhaps without even noticing she has done so, and then rushes forward and throws herself in.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Splash!</span>">>
<<run (function () {
try {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("splash")
: null;
if (!tr) return;
try { tr.stop(); } catch (e) {}
try { tr.loop(false); } catch (e) {}
try {
const base = (setup.audio && setup.audio.getSfxVolume01)
? setup.audio.getSfxVolume01()
: ((settings.masterVolume ?? 10) / 10);
tr.volume(Math.max(0, Math.min(1, base)));
} catch (e) {}
try {
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
} catch (e) {}
} catch (e) {}
})()>>
<<goto "Event_Major_WildlingBath_Patient_4">>
<</button>>
</div>''<div class="hub-textbox">
Water covers your eyes for a moment, making you squint. It is only a heartbeat later that she breaks the surface, soaked and gasping, her hands flying wildly as though she has fallen into the deepest part of a fast-moving river.
One of them quickly latches onto you. Eyes squeezed shut, she pulls herself closer, coughing, her naked body pressing against yours. She does not seem to notice or mind it. Instead, she struggles to open her eyes and look at you, then lets out a wordless sound.
Not. Coward.
You smile and raise your hands in surrender. That seems to satisfy her.
Then a moment passes. Then another.
She does not seem to be enjoying the water exactly, but neither does she seem bothered by it now. She simply stays pressed against you. In the end, you sigh and decide to focus on what you brought her here for in the first place.
You pull her suddenly so that she is seated between your legs, then begin washing the grime from her body. Her arms, her armpits, her breasts, even her groin. You expect resistance, but to your surprise there is none. She only stiffens briefly at the sudden movement.
<<nsfwimg "images/events/bath/bath.webm">>
It goes on like that for a while. Every so often, she lets out a quiet sigh, seeming to slowly settle into it, perhaps even beginning to enjoy herself.
At last, when you feel you have done an adequate job, you let go of her. Stretching, you shift her aside and begin to rise. You should head back to camp. There is still work to be done.
But then you feel something holding you, trying to pull you back down.
You turn and find the wildling girl still looking irritated. She points to herself, then to you, and makes a strange motion.
Now. Me. You.
You look at her with a raised eyebrow, then glance back toward the direction of camp.
In the end, you—
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Let her do as she pleases</span>">>
<<goto "Event_Major_WildlingBath_Patient_5">>
<</button>>
<<button "<span class='choice-text'>Get out of the water</span>">>
<<goto "Event_Major_WildlingBath_Patient_Get_Out">>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<run (function () {
try {
if (document.body) {
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
}
} catch (e) {}
})()>>
<<if not $questFlags.q_wildling_bath_patient_5_done>>
<<set $questFlags.q_wildling_bath_patient_5_done = true>>
<<set $questFlags.q_wildling_bath_done = true>>
<<set $questFlags.q_wildling_bath_memory_unlocked = true>>
<<run (function () {
const w = setup.people && typeof setup.people.upsert === "function"
? setup.people.upsert("npc_wildling", {})
: null;
if (w) w.love = Number(w.love ?? w.trust ?? 0) + 20;
})()>>
<</if>>
<</silently>>''<div class="hub-textbox">
You settle back down into the water.
The wildling makes a satisfied sound, somewhere between a grunt and a huff. Then her hands are on you.
She starts with your shoulders, pressing her palms against the muscle there, pushing and rubbing with more force than finesse. Her technique is rough and practical—the same way she might work a knot out of rope. She does not understand that human skin requires gentleness.
Her fingers dig into your arms next, then slide across your chest. She pauses there, her brow furrowing. Her thumb traces the line between your pectorals, then moves lower, following the groove of muscle down your stomach. Her head tilts. The same curious intensity she shows when examining tracks in the mud.
You watch her face as she works. Her eyes move with her hands, mapping the unfamiliar territory of your body. She has never been this close to a man who was not trying to kill or capture her. The realization settles in your mind alongside the strange warmth of her attention.
Her hands reach your waist. She grips your sides, slides lower along your hips. Her fingers brush the top of your thigh, and you feel your cock twitch under the water in response.
She freezes.
Her gaze drops beneath the surface. The murky water obscures details, but the shape of you is visible enough. Thick. Hard. Rising from between your legs like something she has never seen before, or never seen this close.
She looks back up at your face. Then down again.
Her hand moves before she seems to decide to move it. Her fingers find you under the water, wrapping around your shaft with a grip that is too tight and positioned wrong. She holds your cock like she is holding a stick she found in the forest. Examining its weight. Its girth. The way the veins run along the underside.
You let out a slow breath.
Her eyes snap to your face again. Watching. Processing. She adjusts her grip, loosening it slightly, and your breath changes again. A small observation. She files it away.
Then she moves her hand.
<<nsfwimg "images/events/bath/bathHand.webm">>
It is clumsy. Her stroke is uneven, too fast at first, then too slow. She has no rhythm, no technique. She is simply testing. Seeing what happens when she pulls up, when she pushes down, when she squeezes at the base versus the head. Each variation produces a different response from you. A tensed jaw. A sharp inhale. The way your hands grip the stones beneath the water.
She studies all of it with rapt attention.
The water laps against your bodies as she works. Her naked chest presses against your thigh, her small tits barely visible beneath the surface, nipples hard from the cooler air above the waterline. She does not seem aware of the contact. Her entire focus has narrowed to your cock in her hand and the reactions she can pull from you.
A bead of pre-cum leaks from the tip. Her thumb brushes over it, spreading the slick fluid along the head, and the sensation makes you groan low in your throat.
She stops.
Her thumb rubs over the slick spot again, deliberately this time. More of the fluid leaks out, mixing with the warm water. She tilts her head, examines it, then looks at your face with an expression that asks a question she cannot put into words.
You do not answer with words either. You simply let your head fall back and exhale.
That is answer enough.
She continues. Her grip finds a better angle now, still imperfect but learning. Each stroke pulls a wet sound from the water around you, a soft schlick-schlick that mixes with the steam and the distant call of birds. Her other hand braces against your thigh for leverage, her scarred fingers pressing into the muscle there.
The pressure builds low in your gut. Your balls tighten. She notices the change in your breathing immediately. Her pace quickens, matching the urgency she senses in your body, though she could not name what is coming.
You grip the edge of the stone shelf beneath you and spill into the water.
Your cum clouds the surface between you for a moment before the spring's gentle current carries it away. She watches this with open fascination, her hand still wrapped around your softening cock, her fingers coated in the white fluid.
She lifts her hand above the water. Examines it. Sniffs it once. Then wrinkles her nose and wipes her palm against your chest.
You laugh.
It surprises you both.
She looks at you like you have made a strange animal noise. Then something shifts in her expression. Not a smile. She does not smile. The tension in her shoulders eases, though. Her posture loosens.
You both stay in the water a while longer.
At some point she moves away from you and begins washing herself properly, mimicking the motions you used on her earlier. You watch without staring. When she finishes, she wades toward the edge and climbs out, water streaming down her thin, scarred body. She waits on the stones for you, arms crossed, dripping.
You follow.
The walk back to camp is quiet. She trails behind you at first, then draws alongside, then occasionally moves ahead to scout the path before falling back again. She does this three times before she seems to remember that she does not need to. That nothing here is hunting her.
At the edge of camp, she pauses. Looks at you. Makes a low sound in her throat, then turns and heads toward Morag's area without another glance.
You watch her go.
Something has changed between you. You cannot name it exactly.
But you have touched her now. She has touched you. In the hot water and the steam, something passed between you that required no language.
It is a start.
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+20</span>
</div>
<div class="result-line good">
<span class="label">New normal event</span>
<span class="value">Spring Heat</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>End Event</span>">>
<<run (function () {
try {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack("stars");
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr && typeof tr.stop === "function") tr.stop();
}
if (State && State.variables && State.variables.musicState && String(State.variables.musicState.track || "") === "stars") {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set $questFlags = $questFlags || {}>>
<<run (function () {
try {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack("stars");
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr && typeof tr.stop === "function") tr.stop();
}
if (State && State.variables && State.variables.musicState && String(State.variables.musicState.track || "") === "stars") {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<run (function () {
try {
if (document.body) {
document.body.classList.remove("wildling-bath-fade", "wildling-bath-blackout");
}
} catch (e) {}
})()>>
<<if not $questFlags.q_wildling_bath_patient_get_out_done>>
<<set $questFlags.q_wildling_bath_patient_get_out_done = true>>
<<set $questFlags.q_wildling_bath_done = true>>
<<run (function () {
const w = setup.people && typeof setup.people.upsert === "function"
? setup.people.upsert("npc_wildling", {})
: null;
if (w) w.love = Number(w.love ?? w.trust ?? 0) + 10;
})()>>
<</if>>
<</silently>>''<div class="hub-textbox">
You rise from the water.
Behind you, the wildling makes a sound. Sharp. Caught between confusion and protest. Her hand is still extended where it had gripped your arm, fingers curled around nothing.
You turn to face her. Shake your head once. Then gesture toward the direction of camp.
Work. Duty. Later.
She stares at you. Her expression shifts through several stages too quickly to track. The confusion lingers longest. Then something harder settles behind her eyes.
Her hand drops back into the water. She looks away from you, toward the far edge of the spring where the rocks meet the treeline. Her jaw works for a moment, teeth pressing together.
You wade to the shore and climb out. The cool air raises gooseflesh across your skin as water streams from your body. Behind you, you hear her moving as well, the displacement of water as she follows.
Neither of you speak. There is nothing to say.
You dress in silence. She does the same with the scraps of hide she arrived in, tugging them into place with sharp, irritated movements. Her back stays turned to you the entire time.
The walk back to camp stretches longer than the walk out.
You can feel her gaze on your shoulders, heavy with something she cannot name and you have chosen not to address.
At the edge of camp, she breaks away without a sound. Heads toward Morag's area. She doesnt look back.
Morag intercepts you a few minutes later, sniffing the air near your shoulder with an appraising squint.
"She smells better," the old woman allows. Then her eyes narrow further. "Something sour about her mood, though. What did you do?"
You tell her nothing happened.
Morag snorts and waves you off, clearly unconvinced but uninterested in pressing further.
In the end, you focus on your other duties. Being Chieftian is busy work after all
<div class="result-list">
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+10</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>End Event</span>">>
<<run (function () {
try {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack("stars");
} else {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("stars")
: null;
if (tr && typeof tr.stop === "function") tr.stop();
}
if (State && State.variables && State.variables.musicState && String(State.variables.musicState.track || "") === "stars") {
State.variables.musicState.playing = false;
State.variables.musicState.track = "";
State.variables.musicState.source = "";
}
} catch (e) {}
})()>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set $outcastSpecialTurn = $turn>>
/* Grab the selected major event */
<<set _entry = $currentEvent>>
<<set _ev = _entry ? _entry.event : null>>
/* Safety */
<<if !$campNpcs>><<set $campNpcs = []>><</if>>
<</silently>>
''<div class="hub-textbox">
You return from the hunt with the forest still humming in your bones. Blood has dried on stone, breath has slowed, and the quiet has settled back into its old, watchful shape.
Then it breaks.
Someone crashes through the undergrowth ahead—careless, panicked, running too fast for silence to matter. Branches snap. Leaves scatter.
She stumbles into the clearing.
Young. Striking, even now. Dark hair tangled with sweat and leaves, tribal markings half-hidden beneath torn hides. One hand presses desperately to her side, fingers slick with blood. Her chest rises and falls in short, painful gasps.
The moment she sees you and your hunters, instinct takes over.
She turns, planting her feet, shoulders squaring despite the tremor running through her body. Her eyes burn—defiant, feral, ready to fight even as her knees threaten to give out.
Her gaze locks on you.
“Stay back,” she snaps in a language your hunters do not know.
A few of them exchange brief, puzzled glances. One tilts his head slightly, listening for meaning that isn’t there. Another shifts his grip on his spear, wary but unsure.
The sound should mean nothing.
Instead, the meaning settles into you without effort—clear, immediate, undeniable. Not learned. Not translated. Recognized. As if the words were already waiting for you, somewhere deep and unexamined.
“I won’t—”
Her resolve fractures.
Her legs fold beneath her. She drops to one knee, then both, palm slamming into the dirt as she tries to stay upright. A harsh breath tears out of her. Her head lowers, hair falling across her face.
<img src="images/events/Outcast/Outcast.png" alt="Amogus">
Your hunters murmur quietly behind you—not fear, not alarm. Just uncertainty, the low sound of men watching something they don’t fully understand.
She looks up again, jaw clenched so tightly it shakes. Pride wars with desperation—and loses.
“Please…”
The word scrapes its way out of her, barely louder than the forest itself.
No one else reacts.
And yet you understand her clearly.
The men do not hold their breath.
They just wait for your command.
</div>''
<div class="hub-buttons">
<<button "Help her">>
<<set $outcastIntroChoice = "help">>
<<goto "Event_meeting_outcome_help">>
<</button>>
<<button "Leave her">>
<<set $outcastIntroChoice = "leave">>
<<goto "Event_meeting_outcome_leave">>
<</button>>
</div><div class="event-screen-shell">
<div class="event-screen-head">
<div class="event-screen-kicker">Council Fire</div>
<h2 class="event-screen-title">The Camp Brings Matters Before You</h2>
<p class="event-screen-intro">Whispers, quarrels, and omens gather at the fire's edge. Hear the urgent calls first, then the smaller stirrings of the turn.</p>
</div>
<<eventList>>
</div>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>><<silently>>
<<set _roll = random(1,20)>>
<<set _dc = 8>>
<<set _stat = Number($wisdom ?? 0)>>
<<set _label = "Wisdom">>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _dc)>>
/* Power option: Sway */
<<set _sway = setup.powerById("sway")>>
<<set _swayCost = Number(_sway ? (_sway.cost ?? 35) : 35)>>
<<set _hasSway = !!($powersOwned && $powersOwned.sway)>>
<<set _canSway = _hasSway and Number($belief ?? 0) >= _swayCost>>
<</silently>>
''<div class="hub-textbox">
You crouch down, your fingers tracing the edge of a print. The earth is cool and damp. With the focus of a seasoned hunter, you begin to follow the trail.
<<if _success>>
Your hunter's eyes, honed by seasons of tracking, follow the faint impressions. The tracks are light, many, and hurried.
They lead you away from the main paths, through a thicket of thorns, and down to a hidden hollow where a small fire flickers. Huddled around it are a handful of women.
There is a stark, fragile beauty to them—fine cheekbones and wide eyes that seem too large for their gaunt faces. They are a tribe, but a fragile one, barely clinging to the wilds, their expressions a mixture of fear and defiance.
<<else>>
You follow the prints for a short while, but the ground grows too rocky, the trail too faint. The light fails completely, and you are left with nothing but the growing cold and the sense of a mystery unsolved. With a frustrated sigh, you turn back toward camp, the rabbits on your shoulder suddenly feeling much lighter.
<</if>>
<div class="result-list">
<<if _success>>
<div class="result-line good">
<span class="label">Investigation</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Investigation</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _roll>></span>
</div>
<div class="result-line">
<span class="label"><<print _label>> + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _dc>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<if _success>>
<<button "Take what you want">>
<<set $whispersChoice = "take">>
<<goto "Event_SmallTracks_Resolution">>
<</button>>
<<button "Offer them to join your tribe">>
<<set $whispersChoice = "join">>
<<goto "Event_SmallTracks_Resolution">>
<</button>>
<<if _canSway>>
<<button "Use Sway — Calm them (Sway: <<print _swayCost>> Belief)">>
<<set $whispersChoice = "sway">>
<<goto "Event_SmallTracks_Resolution">>
<</button>>
<<else>>
<span class="macro-button disabled"
title="<<print _hasSway ? ('Need ' + _swayCost + ' Belief.') : 'You have not acquired Sway.'>>"> Use Sway — Calm them (Sway: <<print _swayCost>> Belief)
</span>
<</if>>
<<else>>
<<button "Return to camp">>
<<endMajorEvent>>
<</button>>
<</if>>
</div><<silently>>
<<set _dc = 12>>
/* Power: Sway */
<<set _sway = setup.powerById("sway")>>
<<set _swayCost = Number(_sway ? (_sway.cost ?? 35) : 35)>>
<</silently>>
''<div class="hub-textbox">
<<if $whispersChoice is "take">>
<<silently>>
/* DC override for TAKE path */
<<set _dc = 6>>
<<set _label = "Endurance">>
<<set _stat = Number($endurance ?? 0)>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _dc)>>
<</silently>>
<<if _success>>
A sharp crack echoes as a stone rebounds from your skull, thrown by a pair of trembling hands. You don't flinch, merely staring down with the cold indifference of a predator until the woman shrinks back, freezing in place.
The silence reigns, heavy and suffocating. You drop your catch with a wet thud, the sound like a gunshot in the quiet.
Your arms cross over your chest, emphasizing the sheer bulk of muscle that towers over them, stripping away any illusion of hope for resistance. A single finger points to the dirt at your feet, then shifts to the woman with the most ample hips, a command that requires no words.
She understands immediately. She crawls forward, lower lip quivering, and loosens the furs at your waist with clumsy haste. Your length springs free, thick and imposing, and she takes it into her mouth without hesitation
<<nsfwimg "images/events/HiddenTribe/HiddenTake.gif">>
The heat is sudden and wet, her tongue working along the shaft in a desperate bid for survival and favor. You stand rigid, accepting this primal tribute while the others watch with wide, terrified eyes, the lesson cementing itself in their minds.
Once you have spilled your seed down her throat, securing your dominance, you right your clothes and loom over them. With a sharp gesture, you herd the trembling group out of the hollow.
They follow behind you like sheep, their fate sealed as they are led toward the fires of your camp to serve as your personal concubines. It is good to be chieftain.
<<set $pops += 5>>
<<else>>
Instead, the tension snaps. Something small and hard—a stone—whistles through the air and strikes your forehead.
There's no pain, only a sharp shock, and your eyes clamp shut by pure reflex. In that single, black moment, the hollow erupts in a flurry of panicked motion.
By the time you blink them open again, they are gone. They have scattered into the wilds, a desperate whisper of movement through the undergrowth. You are left standing alone in the hollow, the fire sputtering uselessly still.
<</if>>
<div class="result-list">
<<if _success>>
<div class="result-line good">
<span class="label">Endurance check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Endurance check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _roll>></span>
</div>
<div class="result-line">
<span class="label"><<print _label>> + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _dc>></span>
</div>
<<if _success>>
<div class="result-line good">
<span class="label">Population</span>
<span class="value">+5</span>
</div>
<</if>>
</div>
<<elseif $whispersChoice is "join">>
<<silently>>
<<set _dc = 14>>
<<set _label = "Charisma">>
<<set _stat = Number($charisma ?? 0)>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _dc)>>
<</silently>>
<<if _success>>
You don't approach them as a conqueror, but as an offer of sanctuary. Your voice is low and steady, a calm balm on their frayed nerves. You speak not of strength, but of shared fires. Not of rule, but of protection. You paint a picture not of submission, but of survival, of a future where their children won't have to huddle in the cold, their bellies empty.
The defiance in their eyes doesn't vanish, but it is slowly joined by something new: a flicker of desperate, terrifying hope. A silent conversation passes between them, a series of glances that weigh the certainty of slow starvation against the terrifying uncertainty of trust.
Finally, the eldest among them, her face a map of hardship, gives a slow, deliberate nod. It is an acceptance, fragile as a new leaf in a storm.
Your tribe grows, not by the sword, but by the outstretched hand.
<<set $pops += 5>>
<<set $stability += 5>>
<<else>>
You open your mouth to speak, intending to extend an offer of sanctuary, of shared strength. But before a single word can form, the eldest woman gives a sharp, cutting gesture with her hand. It is a signal, silent and unmistakable.
The hollow erupts. It is not a retreat, but a vanishing. One moment they are a huddled group of wide eyes and defiant faces; the next, they are a chaos of snapping twigs and rustling leaves, disappearing into the dense undergrowth with a desperate speed that takes you by surprise. Your offer of alliance dies on your tongue, unheard and unconsidered.
You are left standing alone by the sputtering fire, the echoes of their flight already fading into the deep woods. The only thing you have gained is the silence of an empty clearing.
<</if>>
<div class="result-list">
<<if _success>>
<div class="result-line good">
<span class="label">Charisma check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Charisma check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Roll</span>
<span class="value">d20 = <<print _roll>></span>
</div>
<div class="result-line">
<span class="label"><<print _label>> + d20 vs DC</span>
<span class="value"><<print _total>> / <<print _dc>></span>
</div>
<<if _success>>
<div class="result-line good">
<span class="label">Population</span>
<span class="value">+5</span>
</div>
<div class="result-line good">
<span class="label">Stability</span>
<span class="value">+5</span>
</div>
<</if>>
</div>
<<elseif $whispersChoice is "sway">>
<<silently>>
<<set $belief = Math.max(0, Number($belief ?? 0) - _swayCost)>>
<</silently>>
You do not threaten or raise your voice. Instead, you lower yourself to one knee, drawing level with them, and lock eyes with the woman closest to you.
You project your will outward, a silent, psychic nudge that bypasses reason to whisper directly to the primitive parts of their brains. It is a warm, heavy fog of suggestion that makes the idea of submission feel like their own sudden, wonderful epiphany.
The shift is subtle but instantaneous. The tension drains from their posture, replaced by a languid looseness.
Their pupils dilate, and the hunted look in their eyes softens into something glassy and inviting. You reach out to brush a stray hair from the leader's cheek, and she leans into your touch, sighing as if she has been waiting for it all her life.
Driven by this implanted hunger, two of them slip forward, hands moving with practiced eagerness to untie your furs. Your cock springs free, and they descend upon it together, a tangle of wet tongues and soft lips working in tandem to worship your shaft. They look up at you with pure, diluted adoration, their pleasure derived entirely from serving your length, drowning out the world around them.
<<nsfwimg "images/events/HiddenTribe/HiddenSway.gif">>
Once you have spent yourself down their eager throats, marking the seal of your control, they wipe their mouths and rise as one. Their fear is forgotten, replaced by vacant, welcoming smiles that promise total obedience.
<<set $pops += 5>>
<<set $stability += 3>>
<div class="result-list">
<div class="result-line good">
<span class="label">Power used</span>
<span class="value">SWAY</span>
</div>
<div class="result-line">
<span class="label">Belief spent</span>
<span class="value">-<<print _swayCost>></span>
</div>
<div class="result-line good">
<span class="label">Population</span>
<span class="value">+5</span>
</div>
<div class="result-line good">
<span class="label">Stability</span>
<span class="value">+3</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "Conclude">>
<<unset $whispersChoice>>
<<endMajorEvent>>
<</button>>
</div><<silently>>
/* Optional: mark when tutorial narrative starts (safe even if unused) */
<<set $tutorialSpecialTurn = $turn>>
<</silently>>
''<div class="hub-textbox">
<p>After a couple of months, you and your tribe have finally begun to settle into this new home.</p>
<p>Not comfortably.</p>
<p>Not easily.</p>
<p>The shelters stand. The fires burn. The children laugh again.</p>
<p>But the land has tested you at every step.</p>
<p>“$user… we’ve got a problem.”</p>
<p>You turn toward the voice even before you see its owner.</p>
<p>Kael.</p>
<p>Broad-shouldered, fair-haired, his beard thick and untamed — a man built like a bear, and just as imposing. Yet his eyes hold a patience and awareness that don’t quite fit his age.</p>
<p>Once, he was the chieftain’s son. A boy more interested in wandering the woods and pestering hunters than learning their craft.</p>
<p>That did not last.</p>
<p>He grew strong. Then capable. Then dependable.</p>
<p>And when his father died, Kael was the first to stand before the tribe and name you as chieftain.</p>
<p>Since then, he has been your most loyal aide. Your sharpest hunter.</p>
<p>And, whether he would say it, in his view — your friend.</p>
<p>Today, the way his jaw is set tells you this is no small matter.</p>
<div class="hub-buttons">
<<button "What is it?">>
<<goto "Event_Tutorial_1">>
<</button>>
</div>
</div>''<<silently>>
/* Safety */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$campNpcs>><<set $campNpcs = []>><</if>>
/* Add Kael to camp NPC list (once; widget prevents dupes) */
<<run setup.campNpcs.addKael()>>
/* NEW: When Kael is added, raise his Trust + Obedience to 80 */
<<run (function () {
try { setup.people.syncCampNpcsToPeople(); } catch (e) {}
const k = setup.people.upsert("npc_kael", {});
if (!k) return;
k.trust = Math.max(Number(k.trust ?? 0), 80);
k.obedience = Math.max(Number(k.obedience ?? 0), 80);
})();>>
/* Start the relocation quest (adjacent marker like Outcast chain) */
<<addQuestAdjacentToCamp
"q_tutorial_migration_01"
"Relocate the Tribe"
"Kael has found a richer region nearby—but smoke in the distance suggests others may already be close."
"Move your camp to the marked tile using the Map’s “Migrate here” option."
"Quest_Tutorial_Migration_01"
>>
/* Optional: highlight it */
<<set $trackedQuestId = "q_tutorial_migration_01">>
<</silently>>
''<div class="hub-textbox">
Kael exhales through his nose, then gestures vaguely toward the treeline beyond the camp.
“The game here is thinning,” he says. “We can live off what’s left for another season — but only just.”
He scratches at his beard, thoughtful.
“I scouted a richer region,” he continues. “A half-day’s walk from here. Plenty of sign. Water, too. If we wait, others will notice it as well.”
His gaze returns to you.
“We should move sooner rather than later.”
You nod, letting the words settle, and (for a moment) turn back to what you were doing.
Kael does not leave.
You glance up. One brow raised.
This is usually when the real reason comes.
“…While scouting,” he says more quietly, “we saw smoke.”
He pauses.
“We didn’t approach. But from what we could tell, they’re close enough to matter.”
Before he can say more, something tugs sharply at his hide-wrap.
A small boy clings to him with both hands — fair-haired, same eyes, same stubborn set to his jaw.
Kael looks down. For a moment, the edge of his sternness dulls.
Then it returns.
“Aedan,” he says. “I’m speaking with the chieftain.”
“But Da—” the boy protests, refusing to let go.
“Cian and Cormac are fighting again! Ma said to fetch the chieftain to stop it!”
He says it proudly, as if entrusted with a great task.
Kael sighs.
You’re smiling — whether from fondness or quiet amusement, only you know.
“My apologies, $user,” Kael says at last. “I’ll deal with it. You needn’t trouble yourself.”
He hesitates, then adds:
“If you want to continue this later, you’ll find me in my tent.”
With that, he turns, Aedan in tow, leaving you alone with the weight of the decision.
<div class="result-list">
<div class="result-line good">
<span class="label">Task accepted</span>
<span class="value">Relocate the Tribe</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
/* Safety */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* Find the migration quest and repurpose it */
<<set _qid = "q_tutorial_migration_01">>
<<set _qIndex = -1>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<<if _qIndex >= 0>>
<<set $quests[_qIndex].name = "Deal with the Unknown Tribe">>
<<set $quests[_qIndex].desc = "Kael has found signs of another tribe nearby—smoke, tracks, and hunger. They are weak, but not harmless.">>
<<set $quests[_qIndex].objective = "Use Expedition to decide how to handle the tribe (drive off, trade, or absorb).">>
/* Expedition happens from your current camp tile */
<<set $quests[_qIndex].expeditionPassage = "Quest_Tutorial">>
/* Optional but recommended: no longer a “map marker” quest */
<<set $quests[_qIndex].markerRevealed = false>>
/* Keep it active */
<<set $quests[_qIndex].status = "active">>
<</if>>
/* Optional: highlight it */
<<set $trackedQuestId = _qid>>
<</silently>>
''<div class="hub-textbox">
By the time the last shelter is raised and the fires settle into a steady burn, the long journey finally releases its grip on you.
For the first time in days, there is a moment to breathe.
It doesn’t last.
Kael approaches, offering a brief nod before getting straight to the point.
“The perimeter is secure,” he says. “No predators. No other tribes nearby.”
A pause.
“Well. Not nearby enough to stumble into camp.”
He continues, voice low and even.
“While the others were settling in, I followed the signs we saw before. The smoke.”
His eyes meet yours.
“I found them. A small tribe. Smaller than us. Hungry. Weaker.”
Another pause.
“But there are enough of them to matter.”
Kael folds his arms.
“When you’re ready, you can lead an expedition. Meet them. Drive them off. Trade. Absorb them.”
He shrugs.
“How we deal with them is your choice—and your right to decide.”
With that, he turns and returns to his duties, leaving you alone with the camp behind you… and the path ahead.
How to deal with the other tribe is now up to you.
<div class="result-list">
<div class="result-line good">
<span class="label">Task updated</span>
<span class="value">Deal with the Unknown Tribe</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<run setup.campNpcs.addOutcast()>>
/* Create the quest once */
<<addQuestAdjacentToCamp
"q_outcast_brother_01"
"Save the Outcast’s Brother"
"The hunters are close. If you move quickly, you can reach him before they do."
"Go to the marked tile and use Expedition."
"Quest1_BrotherSave">>
/* Optional: track it so its marker stands out */
<<set $trackedQuestId = "q_outcast_brother_01">>
<</silently>>
''<div class="hub-textbox">
She watches you closely now—not for kindness, not for mercy.
For decision.
When you do not turn away, the tension drains from her shoulders in a breath she didn’t realize she was holding.
“Good,” she says.
Then she leans closer, lowering her voice—not out of secrecy, but habit.
“They don’t roam blindly,” she says. “They move the way they always have. Following water when they can. Keeping high ground when they can’t. Closing in slowly.”
Her eyes flick briefly toward the edges of the camp, toward the land beyond it.
“They’ll be nearby,” she continues. “Close enough that the tracks aren’t cold yet. Far enough that they think they have time.”
She straightens slightly.
“If we move soon, we can reach him before they finish it.”
Nothing more specific is offered.
Paths. Signs. Habits.
Enough.
<br><br>
<div class="result-list">
<div class="result-line good">
<span class="label">Task accepted</span>
<span class="value">Help the Outcast save her brother</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
She watches you closely now—not for kindness, not for mercy.
For decision.
When it becomes clear what you’ve chosen, something closes behind her eyes. Not anger. Not disbelief.
Resolution.
She exhales slowly and nods once, as if confirming something to herself.
“Then I won’t stay,” she says quietly. “Not while he’s out there.”
She shifts carefully, testing her weight, gathering what strength she has left. Pain flickers across her face, but she does not hesitate.
No one moves to stop her.
She leaves before the sun reaches its height, heading back toward the trees without looking over her shoulder.
Whether she reaches her brother first—or whether the hunters do—remains unanswered.
The forest will decide.
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<endMajorEvent>>
<</button>>
</div>''<div class="hub-textbox">
You move.
The choice is made without ceremony.
Your hunters read it immediately. One lowers his spear. Another steps aside. No one questions it. Whatever uncertainty they felt fades into routine—injured bodies are not rare in this world.
She does not react.
She remains where she lies, eyes half-lidded now, breath uneven. Whatever had driven her this far has already spent itself.
Up close, the wound is clear. Not fresh, but angry. Blood soaked into hide and soil alike. The kind of injury that does not forgive delay.
One of your hunters crouches instinctively, then pauses, waiting. You give no words, but the intent is enough.
They lift her carefully.
She is lighter than expected—not frail, just worn thin by fear, pain, and distance. Her head lolls slightly as she is moved, hair falling across her face. She does not wake.
As you turn back toward camp, the forest watches without protest.
This does not make you merciful.
It does not make you cruel.
It simply marks that, when the moment came, you chose not to leave a living thing behind.
What that means—if it means anything at all—only you know.
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<goto "meeting_morning">>
<</button>>
</div>''<div class="hub-textbox">
You do nothing.
The moment stretches, quiet and unremarkable. No drama follows. No sign from the forest. Just time passing.
She remains where she fell, one hand still pressed to her side, breath shallow and uneven. Her eyes stay on you for a few heartbeats longer, searching your face for something—anything—that might change.
It doesn’t.
Something in her gaze dulls. Not fear. Not anger.
Acceptance.
Her fingers loosen slightly in the dirt. Her breathing steadies—not stronger, just slower. She turns her face away from you, toward the trees, as if already orienting herself to what comes next.
Your hunters shift their weight. One glances at you. Another looks to the forest edge, then back to her unmoving form. No one speaks.
This world is not cruel.
It is simply young.
In a world like this, wounded people who are left behind usually do not return. Sometimes they crawl a little farther. Sometimes they last the night. Sometimes they surprise everyone.
Most do not.
You turn away first.
The men follow without comment. The forest swallows sound quickly. Behind you, there is no cry, no curse, no accusation—only the ordinary noise of leaves and wind reclaiming a fallen body.
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
/* Stop the main theme (and anything else) the moment we enter this passage */
<<run setup.stopAllAudio()>>
/* Start the intro/dream track */
<<run setup.playIntro()>>
<</silently>>
''<div class="hub-textbox">
After the day’s work around camp is finished, you take your hunters out to lay in meat for the coming winter.
<br><br>
You track your quarry for hours—reading broken twigs, crushed grass, the faintest smears of sign—until, as always, you pull ahead. You don’t mean to. It just happens. Even your fastest hunters struggle to match your pace now, and with each passing day it becomes harder for them to pretend otherwise.
<br><br>
Then it starts again.
<br><br>
Not a sound in the air—nothing your ears can catch—yet something in you stirs. A whisper without words, pressing at the back of your thoughts. Beckoning. Calling. Drawing you deeper between the trees.
<br><br>
The need to obey is unbearable. Too primal. Too instinctive. You follow an invisible path, your legs moving with a certainty that doesn’t feel like your own, until the forest thins and you find yourself standing before it— <!-- IMAGE PLACEHOLDER -->
<div class="hub-image">
<img src="images/expeditions/WhisperQuest/CaveEnterance.png" alt="A cave enterance" />
</div>
<br><br>
The cave from your dreams.
<br><br>
Ordinary. Almost laughably mundane. Just a dark mouth in a hillside. And still, the moment you see it, your heart tightens, because the entrance feels like it could lead to every answer you’ve ever wanted… or to nothing at all.
</div>''
<div class="hub-buttons">
<<button "Enter">>
/* Put your next passage name here */
<<goto "Expedition_WhisperingMouth_1">>
<</button>>
</div><<silently>>
/* Safety */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$quests>><<set $quests = []>><</if>>
<</silently>>
''<div class="hub-textbox">
When you step into the cave, you don’t find anything you can name as important.
<br><br>
It’s a small space—barely large enough for ten people to stand shoulder-to-shoulder. No tunnels. No chambers. No hidden depth. And yet the excitement doesn’t fade. That strange, wordless emotion that’s haunted you since the dream—since the moment you saw the entrance—clings to you like smoke. A nostalgia for something that has never happened.
<br><br>
Your hands rise to the walls almost on their own.
<br><br>
The stone is the smoothest thing you’ve ever touched. Too smooth. Its color is strange as well: the same dull grey as the rocks outside, and yet it feels… old in a way nature doesn’t make. Like age has worn it, not wind.
<br><br>
Pebbles litter the ground. No skitter of rodents. No whisper of insects. Even the air feels held. The scattered stones begin to look less like debris and more like arrangement—an order that makes no sense, but an order all the same.
<br><br>
You crouch and start to pick them up, one by one.
<br><br>
Just rocks. Every single one.
<br><br>
Until, after a while—
<div class="hub-image">
<img src="images/expeditions/WhisperQuest/StoneArtifact.png" alt="A strange violet-sheened stone" />
</div>
<br><br>
—you find it.
<br><br>
You don’t know what it is, only that it isn’t like anything you’ve held before. A small stone, strangely glossy, catching what little light there is with a muted violet sheen. The moment it settles into your palm, something in you buckles. Nostalgia hits so hard you nearly gasp, nearly drop to your knees—grief and longing for a life you’ve never lived.
<br><br>
Then it’s gone.
<br><br>
The purple stone is only a stone again. Cold and solid and ordinary.
<br><br>
And yet… it leaves warmth behind. Not in your skin, but deeper—like an ember pressed into your chest.
<br><br>
You slip it into your pocket and turn to leave.
<br><br>
At the entrance, you glance back one last time—and your eyes seem to betray you. For a heartbeat, in the cave’s smooth wall, you see a face where no face should be: a reflection that mirrors your own too closely to be chance.
<br><br>
You blink.
<br><br>
It’s gone.
<br><br>
<div class="result-list">
<div class="result-line good">
<span class="label">Artifact Acquired</span>
<span class="value">Strange Stone</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Return to camp">>
<<silently>>
/* Grant artifact (idempotent: grant() won't duplicate ownership) */
<<if setup.artifacts and setup.artifacts.grant>>
<<run setup.artifacts.grant("relic_strange_stone")>>
<</if>>
/* Update the current task for the existing quest */
<<set _qid = "q_whispering_mouth_01">>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and $quests[_i].id is _qid>>
<<set $quests[_i].objective = "What is the stone?">>
<<set $trackedQuestId = _qid>>
<<set $questFlags.q_whispering_mouth_01_foundStone = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<</silently>>
<<goto "Hub_1">>
<</button>>
</div><div class="hub-textbox">
<h2>Extras</h2>
<ul>
<li>[[Help|Help]]</li>
<<if Story.has("Sandbox")>>
<li>[[Sandbox Tools|Sandbox]]</li>
<</if>>
</ul>
<<return "Go Back">>
</div><div class="hub-header">
<div class="hub-title">
Game Over
</div>
</div>
<div class="hub-textbox">
The last fire dies without ceremony.
No footsteps. No voices. No hands left to raise shelter, to carry water, to bury the dead, to keep the stories from unraveling in the dark.
Whatever you were building here—whatever you meant to become—ends in silence.
<br><br>
<<button [[Return to Title|Main_Menu]]>><</button>>
</div><div class="hub-textbox">
<h2>Help</h2>
<p>
This is your field manual: what the numbers mean, what changes each turn, and why things go wrong.
Pick a topic below.
</p>
<ul>
<li>[[Stats & Checks|Help_Stats]]</li>
<li>[[Your Tribe (Economy)|Help_Tribe]]</li>
<li>[[Military Strength & Raids|Help_Military]]</li>
<li>[[Season Plan & Action Points|Help_SeasonPlan]]</li>
<li>[[Map, Tiles, and Moving Camp|Help_Map]]</li>
<li>[[Events & Major Events|Help_Events]]</li>
</ul>
<<link "Go Back">>
<<goto "Extras">>
<</link>>
</div><div class="hub-textbox">
<h2>Events & Major Events</h2>
<p>
Events are the main way the game reacts to your situation. Some resolve instantly. Others give you choices or stat checks.
</p>
<ul>
<li><b>Normal Events</b> — quick events with small effects (resources, mood changes, minor choices).</li>
<li><b>Major Events</b> — larger story moments that stop progress until you resolve them. They usually have bigger consequences.</li>
</ul>
<h3>How events get triggered</h3>
<ul>
<li><b>End of turn</b> — most events are rolled at the end of a season, based on current conditions.</li>
<li><b>Your situation</b> — values like <b>Food</b>, <b>Stability</b>, <b>Zeal</b>, <b>Raid Chance</b>, and <b>Population</b> can make certain events more likely (or block them).</li>
<li><b>The tile you are on</b> — <b>Terrain</b>, <b>Game</b>, and <b>Resources</b> can influence what events you see.</li>
<li><b>Other tribes</b> — nearby tribes, their temperament, and your relations can lead to raids, demands, or trade offers.</li>
<li><b>Quests</b> — some events only happen when a quest is active or when you reach the correct map tile.</li>
<li><b>Your choices</b> — some actions or plans can unlock follow-up events later (good or bad).</li>
</ul>
<h3>Tips</h3>
<ul>
<li>If something suddenly gets worse, check <b>Food</b>, <b>Stability</b>, <b>Raid Chance</b>, and your current tile.</li>
<li>If you want more control long-term, invest in <b>Stability</b> and <b>Goods</b>, and avoid staying in high danger tiles.</li>
<li>If you lose or gain Pops unexpectedly, check the Report—events and growth can offset each other in the same turn.</li>
</ul>
<p>[[Back to Help|Help]]</p>
</div><div class="hub-textbox">
<h2>Map, Tiles, and Moving Camp</h2>
<p>
The map is a grid of tiles. Your camp is always on exactly one tile, and that tile affects what you can do this turn.
</p>
<h3>Tile Info</h3>
<ul>
<li><b>Terrain</b> — the land type. It mostly affects what events can happen and what the area is good for.</li>
<li><b>Game</b> — how good the tile is for food actions (hunting, foraging). Higher Game usually means better Food results.</li>
<li><b>Resources</b> — how good the tile is for gathering materials. Higher Resources usually means better yields from resource actions.</li>
<li><b>Raid Chance</b> — how risky the area is right now. Higher values mean more danger events are likely.</li>
</ul>
<h3>Why your tile matters</h3>
<ul>
<li>Your <b>Season Plans</b> and <b>actions</b> often use the tile’s Game/Resources values to determine results.</li>
<li>Some <b>events</b> depend on Terrain or tile quality.</li>
<li>Staying in a bad tile too long can slow progress. Staying in a dangerous tile can trigger more problems.</li>
</ul>
<h3>Moving Camp</h3>
<p>
Moving camp changes your current tile. This can improve your income, help you find new opportunities, or reduce danger.
</p>
<ul>
<li>After moving, your new tile’s <b>Game</b> and <b>Resources</b> affect your next turn’s best options.</li>
<li>You cannot move onto <b>forbidden</b> tiles.</li>
<li>You cannot move onto a tile occupied by another tribe’s camp.</li>
<li>Many quests and encounters care about your position. Being on the correct tile matters.</li>
</ul>
<p>
<b>Tip:</b> If Food is falling behind, look for higher <b>Game</b>. If you need development materials, look for higher <b>Resources</b>.
If raids are frequent, move away from high <b>Raid Chance</b> areas or invest in military defenses.
</p>
<p>[[Back to Help|Help]]</p>
</div><div class="hub-textbox">
<h2>Military Strength & Raids</h2>
<p>
<b>Military Strength (Mil Str)</b> is a rough “combat rating” for a tribe. It represents numbers, readiness, morale, and leadership.
It is not only weapons.
</p>
<h3>What increases your Mil Str</h3>
<ul>
<li><b>Population</b> — the biggest factor. More Pops means more fighters and support.</li>
<li><b>Training</b> — some actions or plans can raise Mil Str for a while.</li>
<li><b>Zeal</b> — high Zeal helps morale; low Zeal hurts it.</li>
<li><b>Resources</b> — a small bonus (tools, weapons, preparedness).</li>
</ul>
<h3>Raid Chance</h3>
<p>
<b>Raid Chance</b> is a danger meter. It increases when hostile tribes are nearby or when relations are bad.
When it is high, you are more likely to get raid-related events soon.
</p>
<h3>Other tribes: temperament, mood, relations</h3>
<ul>
<li><b>Temperament</b> — their default behavior over the long term (some are aggressive, some prefer trade).</li>
<li><b>Mood</b> — a short-term state (angry, fearful, grateful). It can change their behavior for a few turns.</li>
<li><b>Relations</b> — your long-term standing with them (-100 to +100). High relations unlock better options and reduces conflict.</li>
</ul>
<p>[[Back to Help|Help]]</p>
</div><div class="hub-textbox">
<h2>Season Plan & Action Points</h2>
<p>
Each turn (season) you choose a <b>Season Plan</b> and spend <b>Action Points</b> (Energy) on actions.
This is how you control your economy and prepare for threats.
</p>
<ul>
<li><b>Season Plan</b> — your main focus for the turn. It usually provides your biggest gains (or a strong bonus).</li>
<li><b>Action Points (⚡)</b> — how many actions you can take this turn. Most actions cost 1, some cost more.</li>
<li><b>Costs</b> — many actions spend Food/Resources/Goods to create a benefit.</li>
<li><b>Results</b> — some actions give resources immediately, others improve Stability, Zeal, or Military Strength over time.</li>
</ul>
<h3>Common action types</h3>
<ul>
<li><b>Food</b> — hunting/foraging/preserving. Best on tiles with good <b>Game</b>.</li>
<li><b>Resources</b> — gathering/crafting. Best on tiles with good <b>Resources</b>.</li>
<li><b>Stability</b> — councils, rules, order. Helps prevent collapse and supports growth.</li>
<li><b>Zeal</b> — rituals/omens/faith. Affects Belief gain and morale.</li>
<li><b>Military</b> — training, fortifying. Raises Mil Str and helps you survive raids.</li>
</ul>
<p>
<b>Note:</b> After you end the turn, events happen, then upkeep is paid, then population growth is applied.
</p>
<p>[[Back to Help|Help]]</p>
</div><div class="hub-textbox">
<h2>Stats & Checks</h2>
<p>
Stats are your character’s main attributes. They affect event outcomes, dialogue options, and some tribe-wide systems.
</p>
<ul>
<li><b>Wisdom</b> — planning and awareness. Used for insight, reading situations, and avoiding mistakes.</li>
<li><b>Strength</b> — physical power. Used for force, intimidation, and some combat outcomes.</li>
<li><b>Endurance</b> — toughness. Used for survival, long travel, and resisting hardship.</li>
<li><b>Leadership</b> — command and coordination. Can increase your tribe’s effectiveness in conflicts.</li>
<li><b>Charisma</b> — social influence. Used for negotiation, persuasion, and diplomacy.</li>
<li><b>Stewardship</b> — logistics and efficiency. Can reduce food upkeep and improve outcomes involving planning and trade.</li>
</ul>
<p>
<b>Checks:</b> most rolls are <b>Stat + d20</b> vs a <b>DC</b> (difficulty). Higher stats give better odds.
Some checks also include extra modifiers (relationships, tribe military strength, or other context).
</p>
<p>
Sometimes the UI shows “soft” labels instead of numbers. Those labels still represent the same values.
</p>
<p>[[Back to Help|Help]]</p>
</div><div class="hub-textbox">
<h2>Your Tribe (Economy)</h2>
<p>
These are tribe-wide values. Most of them change every turn from Season Plans, events, and end-of-turn upkeep.
</p>
<ul>
<li><b>Population (Pops)</b> — your tribe size. More Pops usually means more output, but also higher Food upkeep.</li>
<li><b>Food</b> — used to feed your people. Food is spent every turn based on Pops. If Food hits 0, you risk losses and major penalties.</li>
<li><b>Resources</b> — basic materials (wood, stone, hides, tools). Used for development and many actions, and often lost in raids/disasters.</li>
<li><b>Goods</b> — higher-value trade items. Useful for trade and diplomacy, and they can raise your long-term Stability baseline.</li>
<li><b>Belief</b> — spiritual currency. Used for Powers and stat upgrades. It changes each turn and is affected by Zeal.</li>
</ul>
<h3>Stability & Zeal</h3>
<ul>
<li><b>Stability</b> (≈ -50 to +50) — order and cohesion. Higher Stability improves population growth and affects which events can appear.</li>
<li><b>Zeal</b> (≈ -50 to +50) — spiritual momentum. Higher Zeal increases how much Belief you gain (and reduces Belief losses).</li>
</ul>
<p>
<b>Tip:</b> If Pops grow faster than your Food income, you will run into Food problems. Keep an eye on the Report each turn.
</p>
<p>[[Back to Help|Help]]</p>
</div><<silently>>
/* GAME OVER CHECK (population wiped out) */
<<if ($pops ?? 0) <= 0>>
<<goto "Game_Over">>
<</if>>
<<if $tutorialPending>>
<<set $tutorialPending = false>>
<<tutStart>>
<</if>>
<<pickChatter>>
<<if !$mainThemeStarted>>
<<set $mainThemeStarted = true>>
<<run setup.fadeToMainTheme(4)>>
<</if>>
<<set $uiUnlocks.map = true>>
<<set $uiUnlocks.quests = true>>
<<set $uiUnlocks.character = true>>
<<set $uiUnlocks.inventory = true>>
<<set $uiUnlocks.relationships = false>>
<<run setup.map.ensureCampSpawned()>>
<<run setup.map.randomizeTileYieldsOnce()>>
<<run setup.map.setPlayerSpawnTileBaseline()>>
<<if $questFlags and $questFlags.q_dominate_region_started>>
<<updateVictory_DominateRegion>>
<</if>><</silently>>''<div class="hub-wrap"><div class="hub-textbox">This is your camp.
Shelters of wood, hide, and woven reeds cluster along the riverbank, their fires sending thin trails of smoke into the forest canopy. Tools are stacked near half-finished structures. Hunters move in and out of the trees, while others tend to food, children, and the wounded. The camp is not permanent—but it is yours.
For now, it is enough.
<<if $pops <= 5>>
The camp feels quieter than it should. Too many spaces sit empty. Too few voices rise around the fires at night. Every loss still lingers here, unspoken but keenly felt.
<<elseif $pops >= 15>>
The camp bustles with activity. Fires burn from dawn to dusk, laughter and argument blending into constant motion. There are hands for every task—and mouths to match.
<<else>>
Life in the camp moves at a steady rhythm. There are enough hands to meet the day’s needs, and enough quiet moments to remember those who did not make the journey.<</if>>
<<if $stability <= -5>>
Tensions simmer beneath the surface. Arguments break out over food, space, and old grievances. Some nights end with raised voices and clenched fists before exhaustion forces silence.
<<elseif $stability >= 15>>
The camp runs smoothly. Disputes are settled quickly, work is shared without complaint, and people sleep soundly knowing tomorrow will bring order, not chaos.
<<else>>
Order holds, but only just. Most follow the routines you’ve set, though unease sometimes creeps in during long nights or lean days.<</if>>
<<if $zeal <= -5>>
You catch wary glances when you pass through the camp. Some look to you with doubt rather than reverence, whispering questions they dare not ask aloud. You feel it clearly: your people follow you because they must—not because they believe.
<<elseif $zeal >= 15>>
Faith in you burns bright. When you speak, people listen. When you act, they watch with expectation. Stories already grow in the telling, shaping you into something more than mortal in their eyes.
<<else>>
Your presence commands respect, if not unquestioning devotion. The tribe believes in you—but belief, you know, is a thing that must be tended carefully.<</if>>
<<silently>>
<<link "Kill Tribe 1">>
<<debugKillTribe "npc_camp_1">>
<<goto "Hub_1">>
<</link>><br>
<<link "Kill Tribe 2">>
<<debugKillTribe "npc_camp_2">>
<<goto "Hub_1">>
<</link>><br>
<<link "Kill Tribe 3">>
<<debugKillTribe "npc_camp_3">>
<<goto "Hub_1">>
<</link>><br>
<</silently>>
</div>''<div class="hub-actions-wrap"><div class="hub-actions hub-grid">
<<button [[Season Plan|SeasonPlan]]>><</button>>
<<if $metTribes && $metTribes.length > 0>>
<<button [[Other Tribes|OtherTribes]]>><</button>>
<<else>>
<button class="hub-disabled" disabled>Other Tribes</button>
<</if>>
<<npcAnyTalkQuestOfferAvailable>>
<<if _anyNpcTalkQuestOfferAvailable>>
<a class="link-internal hub-interact-quest-link" data-passage="Interact" tabindex="0">Interact with...<span class="hub-interact-quest-badge" title="Quest available">!</span></a>
<<else>>
<<button [[Interact with...|Interact]]>><</button>>
<</if>>
<<button [[Crafting|Crafting]]>><</button>>
<<expeditionButton>>
</div>
</div><div class="screen-wrap screen-panel interact-screen">
<div class="screen-corner-return">
<span class="screen-return-chip">
<<link "Return" "Hub_1">><</link>>
</span>
</div>
<div class="screen-header">
<div class="screen-title">INTERACT</div>
</div>
<div class="screen-body">
<div class="screen-section-title">Camp NPCs</div>
<div class="screen-list interact-list">
<<silently>>
/* Fallback: if not found in $people, try $campNpcs */
<<if !_p and $campNpcs and $campNpcs.length and _pid>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<if $campNpcs[_i] and $campNpcs[_i].id is _pid>>
<<set _p = $campNpcs[_i]>>
<<set _p._source = "campNpc">>
<<break>>
<</if>>
<</for>>
<</if>>
<</silently>>
<<if $campNpcs and $campNpcs.length > 0>>
<<campNpcList>>
<<else>>
<div class="screen-empty">
<div class="screen-empty-icon"></div>
<div class="screen-empty-title">No one here</div>
<div class="screen-empty-sub">Nobody of note is present in camp.</div>
</div>
<</if>>
</div>
</div>
</div><<nobr>>
<<script>>
try { if (setup.inventory && typeof setup.inventory.ensureState === "function") setup.inventory.ensureState(); } catch (e) {}
try { if (setup.artifacts && typeof setup.artifacts.ensureState === "function") setup.artifacts.ensureState(); } catch (e) {}
<</script>>
<div class="invui-root">
<<if !$invTab>><<set $invTab = "items">><</if>>
<div class="invui-header">
<<invTabs>>
<div class="char-return invui-return">
<<return>>
</div>
</div>
<<if $invTab is "items">>
<div class="inventory-layout inv-items-layout">
<div class="inventory-panel inv-left">
<h2>INVENTORY</h2>
<div class="inv-hint">Click an item to view details. Equip gear, use consumables, and track stacks.</div>
<<invCapacitySummary>>
<<invCollectionControls>>
<div class="inv-items-main">
<<invItemGrid>>
<div class="inv-footer inv-details-footer">
<<invDetailsFooter>>
</div>
</div>
<<if $debug>>
<div class="inv-debug-row">
<div class="inv-debug">
<<invDebugGrant>>
</div>
</div>
<</if>>
</div>
<div class="inventory-panel inv-right">
<h2>EQUIPMENT</h2>
<div class="inv-hint">Each slot holds one item. Select gear to highlight compatible slots. Equipped items lose durability each turn.</div>
<<invEquipPanel>>
</div>
</div>
<<else>>
<!-- ARTIFACTS VIEW -->
<div class="inventory-layout inv-artifacts-layout">
<div class="inventory-panel inv-left">
<h2>ARTIFACTS</h2>
<div class="inv-hint">Click an artifact to view details. Activate effects by spending Belief.</div>
<div class="artifact-gridbox">
<<artifactGrid>>
</div>
<<if $debug>>
<div class="inv-debug artifact-debug-row">
<<button "Grant test relic (Shattered Idol)">>
<<run setup.artifacts.grant("relic_test")>>
<<run setup.artifacts.grant("relic_strange_stone")>>
<<goto "Inventory">>
<</button>>
</div>
<</if>>
</div>
<div class="inventory-panel inv-right artifact-status-panel">
<h2>STATUS</h2>
<div class="inv-status">
<<set _ownedKeys = ($relics and Array.isArray($relics.owned)) ? $relics.owned : []>>
<<set _beliefUpkeep = 0>>
<<set _artifactActiveKeys = []>>
<<if $relics and $relics.active>>
<<set _artifactAllActive = Object.keys($relics.active)>>
<<for _a = 0; _a < _artifactAllActive.length; _a++>>
<<set _artifactId = String(_artifactAllActive[_a])>>
<<if setup.artifacts and setup.artifacts.isActive(_artifactId)>>
<<run _artifactActiveKeys.push(_artifactId)>>
<<set _beliefUpkeep += (setup.artifacts.getUpkeepCost ? Number(setup.artifacts.getUpkeepCost(_artifactId) || 0) : 0)>>
<</if>>
<</for>>
<</if>>
<div class="artifact-status-modern">
<div class="artifact-metric-row"><b>Owned:</b> <span><<print _ownedKeys.length>></span></div>
<div class="artifact-metric-row"><b>Active artifacts:</b> <span><<print _artifactActiveKeys.length>></span></div>
<div class="artifact-status-block">
<div class="artifact-status-head"><b>Current active effects</b></div>
<<if !_artifactActiveKeys.length>>
<div class="artifact-status-empty">No active effects.</div>
<<else>>
<ul class="artifact-effects-list">
<<for _a = 0; _a < _artifactActiveKeys.length; _a++>>
<<set _artifactId = String(_artifactActiveKeys[_a])>>
<<set _artifactDef = setup.artifacts ? setup.artifacts.byId(_artifactId) : null>>
<<set _artifactRem = setup.artifacts ? setup.artifacts.activeRemaining(_artifactId) : 0>>
<<set _artifactEffects = []>>
<<if _artifactDef and _artifactDef.activeEffects and _artifactDef.activeEffects.length>><<set _artifactEffects = _artifactEffects.concat(_artifactDef.activeEffects)>><</if>>
<<if _artifactDef and _artifactDef.active and _artifactDef.active.effects and _artifactDef.active.effects.length>><<set _artifactEffects = _artifactEffects.concat(_artifactDef.active.effects)>><</if>>
<<if _artifactDef and _artifactDef.active and _artifactDef.active.desc>><<run _artifactEffects.push(_artifactDef.active.desc)>><</if>>
<<if _artifactDef and _artifactDef.activeText>><<run _artifactEffects.push(_artifactDef.activeText)>><</if>>
<li>
<div class="artifact-effects-name">
<span><<print _artifactDef ? _artifactDef.name : _artifactId>></span>
<span class="artifact-effects-rem"><<print Math.max(1, _artifactRem)>>t</span>
</div>
<<if !_artifactEffects.length>>
<div class="artifact-effects-text artifact-effects-empty">Active.</div>
<<else>>
<<for _j = 0; _j < _artifactEffects.length; _j++>>
<div class="artifact-effects-text"><<= _artifactEffects[_j]>></div>
<</for>>
<</if>>
</li>
<</for>>
</ul>
<</if>>
</div>
<div class="artifact-upkeep-row">
<b>Current belief upkeep:</b>
<span class="artifact-upkeep-value"><<if _beliefUpkeep > 0>><<print _beliefUpkeep>>/turn<<else>>-<</if>></span>
<span><<if _beliefUpkeep > 0>><<print _beliefUpkeep>>/turn<<else>>—<</if>></span>
</div>
</div>
<div class="artifact-status-legacy">
<<set _activeKeys = []>>
<<if $relics and $relics.active>>
<<set _activeKeys = Object.keys($relics.active)>>
<</if>>
<<if !_activeKeys.length>>
<div class="inv-status-empty">—</div>
<<else>>
<ul class="inv-active-list">
<<for _i = 0; _i < _activeKeys.length; _i++>>
<<set _id = String(_activeKeys[_i])>>
<<if setup.artifacts && setup.artifacts.isActive(_id)>>
<<set _def = setup.artifacts.byId(_id)>>
<<set _rem = setup.artifacts.activeRemaining(_id)>>
<li>
<span class="inv-active-name"><<print _def ? _def.name : _id>></span>
<span class="inv-active-rem"><<print Math.max(1, _rem)>>t</span>
</li>
<</if>>
<</for>>
</ul>
<</if>>
</div>
</div>
</div>
</div>
<</if>>
</div>
<</nobr>>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>><<silently>>
/* ===========================
START QUEST: The Wildling Marker on CURRENT tile =========================== */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_wildling_01">>
/* prevent duplicates */
<<if !$questFlags[_qid]>>
<<set $questFlags[_qid] = true>>
<<set $quests.push({
id: _qid,
name: "The Wildling",
desc: "A feral woman set a trap for you. She slipped away into the forest before you could seize her.",
objective: "Use Expedition on your current tile.",
status: "active",
targetX: Number($campX ?? 0),
targetY: Number($campY ?? 0),
markerRevealed: true,
expeditionPassage: "Quest_Wildling"
})>>
/* Optional: auto-track so it stands out */
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<if $trackedQuestIds.indexOf(_qid) is -1>>
<<set $trackedQuestIds.push(_qid)>>
<</if>>
/* Refresh map if you have a renderer */
<<run (function () {
try {
if (setup.map && typeof setup.map.render === "function") setup.map.render();
if (setup.map && typeof setup.map.refresh === "function") setup.map.refresh();
if (setup.map && typeof setup.map.draw === "function") setup.map.draw();
} catch (e) {}
})();>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You don’t wait.
You surge forward the instant she shifts—fast enough that, for a heartbeat, she simply ''stares'', shocked by what she’s seeing. Your speed isn’t human. Not in the way it should be. Not in the way her instincts expect.
But it seems the spirits favor her today.
The trap she set did little to harm you… yet it’s more than capable of stealing your footing.
A cord catches. A loop tightens. Not enough to hold you—never that—but enough to make you ''stumble''. Just for a fraction of a moment.
And that fraction is all she needs.
Your hand closes on empty air where she stood an instant ago. She’s already slipping away—low, quick, agile, vanishing between trunks like something born for this wild.
An agile thing, you think. You don’t believe any of your hunters could match her… at least not in that regard.
You stop instead of chasing. You watch the direction she fled, listening for the smallest sign of her movement.
Even with your speed, it would be difficult to catch her. She has the forest. The paths. The angles. The simple advantage of being on her own ground.
Whatever you meant to do…
It seems it will have to wait for another time.
If there even comes such a time.
<div class="result-list">
<div class="result-line good">
<span class="label">New Task added</span>
<span class="value">The Wildling</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-num'>1</span><span class='choice-text'>Return to camp</span>">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
/* ===========================
START QUEST: The Wildling Marker on CURRENT tile =========================== */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_wildling_01">>
/* prevent duplicates */
<<if !$questFlags[_qid]>>
<<set $questFlags[_qid] = true>>
<<set $quests.push({
id: _qid,
name: "The Wildling",
desc: "A feral woman set a trap for you—and understood your words. She fled into the forest. It didn’t feel like an ending.",
objective: "Use Expedition on your current tile.",
status: "active",
targetX: Number($campX ?? 0),
targetY: Number($campY ?? 0),
markerRevealed: true,
expeditionPassage: "Quest_Wildling"
})>>
/* Optional: auto-track so it stands out */
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<if $trackedQuestIds.indexOf(_qid) is -1>>
<<set $trackedQuestIds.push(_qid)>>
<</if>>
/* Refresh map if you have a renderer */
<<run (function () {
try {
if (setup.map && typeof setup.map.render === "function") setup.map.render();
if (setup.map && typeof setup.map.refresh === "function") setup.map.refresh();
if (setup.map && typeof setup.map.draw === "function") setup.map.draw();
} catch (e) {}
})();>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You raise your hands slowly—palms open, fingers spread—showing they’re empty. No spear. No stone. No sudden movement.
<br><br>
Then you start to speak.
<br><br>
To her, the sounds ''should'' be meaningless. Just noise. Human mouth-shapes. But the moment the words leave you, something impossible happens—
<br><br>
She understands.
<br><br>
Not slowly. Not by guessing. Perfectly.
<br><br>
As if the meaning is already carved into her mind, waiting for you to say it out loud.
<br><br>
Her wary eyes widen a fraction. Even she looks… surprised.
<br><br>
<<if _hasSway>>
To make it go smoother, you let the familiar, subtle pressure seep into your voice.
<br><br>
Not a command. Not force.
<br><br>
Just ''certainty''—a warmth that makes your words land like truth. Sweet as honey, simple as breath, unquestionable as the sky being blue.
<br><br>
For a few moments, the wild girl’s posture softens. Her shoulders loosen by a hair. Her stare unfocuses, drifting—almost glazing over—as if listening becomes easier than resisting.
<br><br>
…Then she jerks, like someone waking from a shallow sleep.
<br><br>
Her head snaps side to side, and whatever softness you coaxed out of her vanishes. If anything, the walls are higher now. Her lips curl, not in anger, but in instinctive refusal.
<br><br>
Before you can say another word, she ''bolts''—a blur of grime and motion—vanishing into the trees as if the forest swallows her whole.
<<else>>
<<if _talkCheck >= 8>>
You keep your tone calm. Slow. Steady. You don’t step closer. You don’t press. You just speak—gentle sounds carrying through the brush like you’re calming a frightened animal rather than addressing a person.
<br><br>
Strangely, the words come easier with every breath.
<br><br>
For a heartbeat, she looks conflicted. Her eyes flick to the side, as if something in her is ''considering''—as if she’s weighing a choice she didn’t expect to be offered. She swallows, jaw tightening, and shakes her head once, hard, as though shaking off a thought.
<br><br>
Her gaze snaps back to you—wary again.
<br><br>
She takes one step back.
<br><br>
Then another.
<br><br>
And then, without turning her back fully, she slips away into the forest—quiet as shadow, gone between one blink and the next.
<<else>>
Your voice stays level, your hands stay open, but for one reason or another, your words don’t reach her the way you intended.
<br><br>
Maybe you choose the wrong tone. Maybe you hesitate at the wrong moment. Maybe your calm sounds like weakness—or like a trick.
<br><br>
Whatever the reason, her eyes never soften.
<br><br>
If anything, your attempt only buys her time to decide—and she decides quickly.
<br><br>
She retreats in a sudden burst, guard never dropping for even an instant, and vanishes into the trees without giving you another breath to try again.
<</if>>
<</if>>
<br><br>
Even if you wanted to chase her, it would be difficult. With your speed you might close the distance—once—but she has the forest, the angles, the paths only she knows. Homefield advantage.
<br><br>
Whatever you meant to do…
<br><br>
It seems it will have to wait for another time.
If there even ''is'' another time.
<div class="result-list">
<div class="result-line good">
<span class="label">New Task added</span>
<span class="value">The Wildling</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-num'>1</span><span class='choice-text'>Return to camp</span>">>
<<endMajorEvent>>
<</button>>
</div><div class="fg-title-menu no-click-sfx">
<div class="fg-hero">
<<silently>><<script>>
try {
// Stop SugarCube tracks (if you're using <<audio>> / <<cacheaudio>>)
if (typeof SimpleAudio !== "undefined") {
SimpleAudio.stop();
SimpleAudio.mute(false); // optional: keep sound enabled for later
}
// Stop any raw HTML5 <audio> elements too (failsafe)
document.querySelectorAll("audio").forEach(a => {
try { a.pause(); a.currentTime = 0; } catch (e) {}
});
} catch (e) {}
<</script>><</silently>>
<!-- TOP: Title block -->
<div class="fg-top">
<div class="fg-kicker">A Chronicle Of The First Age</div>
<div class="fg-title">THE FIRST GODS</div>
<div class="fg-subtitle">A myth of power, survival, and desire.</div>
<div class="fg-top-copy">Shape a camp, a creed, and a legend while the world is still young enough to fear your name.</div>
</div>
<!-- CENTER: Buttons card -->
<div class="fg-card">
<div class="fg-card-frame">
<div class="fg-card-kicker">A Chronicle Written When Time Started To Move Again</div>
<div class="fg-card-title">The First Gods</div>
<div class="fg-card-subtitle">A myth of power, survival, and desire.</div>
<div class="fg-card-rule"></div>
<div class="fg-actions">
<<button [[Begin your journey|Age_Check]]>><</button>>
<<button "Load">>
<<run UI.saves()>>
<</button>>
<<button "Settings">>
<<run UI.settings()>>
<</button>>
</div>
</div>
</div>
<!-- BOTTOM-RIGHT: Patreon -->
<div class="fg-support-callout"><span>Support the project on</span></div>
<a class="icon-slot patreon-badge fg-patreon-corner"
href="https://www.patreon.com/cw/KaspeliProductions"
target="_blank"
rel="noopener noreferrer"
aria-label="Support on Patreon">
<img class="fg-patreon-logo" src="images/patreon_logo.png" alt="Patreon">
</a>
</div>
</div><<nobr>>
<div class="character-layout">
<div class="character-panel">
<div class="map-screen-shell map-screen-shell--survey">
<div class="map-screen-head">
<div class="map-screen-kicker">Travel Board</div>
<h2 class="map-screen-title">Survey the Surrounding Lands</h2>
<div class="map-screen-intro">Study the country beyond the campfire. Click any tile to inspect what can be known from afar.</div>
</div>
<div class="map-screen-meta">
<div class="map-legend-item">
<span class="map-legend-swatch is-camp"></span>
<span><strong>Camp</strong> marks where your people dwell now.</span>
</div>
<div class="map-legend-item">
<span class="map-legend-swatch is-quest"></span>
<span><strong>Tracked signs</strong> point to quests and unusual omens.</span>
</div>
<div class="map-legend-item">
<span class="map-legend-swatch is-tribe"></span>
<span><strong>Known camps</strong> and landmarks remain readable at a glance.</span>
</div>
</div>
<<if $debug is true>>
<<set $debugCampMoveMode = $debugCampMoveMode ?? false>>
<div class="inv-debug-row">
<div class="inv-debug">
<strong>Debug camp move:</strong>
<<if $debugCampMoveMode>>
<<button "Infinite relocate ON">>
<<set $debugCampMoveMode = false>>
<<run Engine.play("Map")>>
<</button>>
<<else>>
<<button "Infinite relocate OFF">>
<<set $debugCampMoveMode = true>>
<<run Engine.play("Map")>>
<</button>>
<</if>>
<div class="muted" style="margin-top:6px;">While active, click any map tile and choose <b>Move camp here</b>. Forbidden and occupied camp tiles remain blocked.</div>
</div>
</div>
<</if>>
<div class="map-board-shell">
<<mapGrid>>
</div>
<!-- still available for debugging; styled subtly in CSS -->
<<silently>>
<<debugTribeCoords>>
<</silently>>
<div class="char-return map-screen-return">
<<return>>
</div>
</div>
</div>
</div>
<</nobr>>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>><<nobr>>
<div class="character-layout">
<div class="character-panel">
<div class="map-screen-shell map-screen-shell--migration">
<div class="map-screen-head">
<div class="map-screen-kicker">Migration Rite</div>
<h2 class="map-screen-title">Choose the Next Homeland</h2>
<div class="map-screen-intro">The tribe waits on your reading of the land. Inspect a neighboring tile, then mark the place where the camp will be carried.</div>
</div>
<div class="migration-guidance">
<div class="migration-guidance-item">
<span class="map-legend-swatch is-reachable"></span>
<span><strong>Gold-ringed tiles</strong> are reachable this move.</span>
</div>
<div class="migration-guidance-item">
<span class="map-legend-swatch is-chosen"></span>
<span><strong>Ember-marked ground</strong> is your chosen destination.</span>
</div>
</div>
<div class="map-board-shell map-board-shell--migration">
<<relocateMap>>
</div>
<div class="migration-note">
<strong>How to commit:</strong> inspect a neighboring tile, choose <b>Migrate here</b> in the land card, then use <b>Continue</b> once the destination is marked.
</div>
</div>
</div>
</div>
<</nobr>>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>><<silently>>
<<set _popLoss = random(1,3)>>
<<set $pops -= _popLoss>>
<</silently>>
<div class="intro-grounded intro-prologue-shell intro-dying no-click-sfx">
You choose west.
It is the natural choice. The forests there are older, denser—places where rivers hide beneath canopies and the land still remembers how to feed those who listen. Your instincts pull you that way, ancient and insistent, whispering that life endures where the light struggles to reach the ground.
<br><br>
The tribe does not question the decision. They trust you now—not because you explain, but because you endure.
<div class="intro-divider">
</div>
The journey begins beneath uneasy skies.
The forest resists you.
Roots claw at ankles. Thorned undergrowth tears at skin and cloth alike. Paths that seem clear one day vanish the next beneath fallen trees and creeping vines. Progress is slow, measured not in distance, but in exhaustion.
Not every member of the tribe can weather this march as you do.
The old struggle to keep pace. The young stumble and falter. Illness spreads in damp camps where firewood is scarce and rest is never enough. You carry where you can. You stand watch through nights that seem endless. Still, loss is unavoidable.
<div class="intro-notification bad">
Your population dwindles.
</div>
There is no ceremony for the fallen. Only quiet hands and bowed heads beneath towering trees that do not care.
<div class="intro-divider">
</div>
Weeks bleed into months.
<br><br>
The forest grows thicker, darker. Sunlight becomes a rumor. Sounds change—less birdsong, more distant calls that echo too long to be comforting. At times, you sense eyes watching from beyond the treeline, shapes that withdraw when confronted. Predators test your camp’s edge. You drive them off, again and again.
The tribe learns to move as you do: silently, cautiously, together.
Winter comes early beneath the canopy. Food runs thin. Tempers fray. Doubt creeps in during long nights when the trees groan and the fire burns low. Yet you press on, guided by something deeper than reason.
<div class="intro-divider">
</div>
Then—after nearly a year of unbroken hardship—you feel it.
<div class="hub-buttons">
<<button "Continue">>
<<goto "Migration_West_Feeling">>
<</button>>
</div>
</div><<silently>>
<<set $stability += 2>>
<</silently>>
<div class="intro-grounded intro-prologue-shell no-click-sfx">
<div class="intro-lead">The forest changes.</div>
The ground softens beneath your feet. The air grows richer, heavier with life. Rivers run clear and wide, fish visible even from the banks. Game trails crisscross the undergrowth, worn deep by countless passing herds. Fruit-bearing trees grow thick along the water’s edge, their branches heavy with promise.
This land is alive.
The tribe feels it too. Shoulders straighten. Voices rise. Children laugh for the first time in many moons. For the first time since the march began, hunger loosens its grip.
You know, with quiet certainty, that this place could sustain your people.
You order the camp to be raised—not as a final settlement, but as a place to breathe, to recover, to plan.
A temporary camp takes shape along the riverbank. Fires are lit. Shelters rise. Wounds begin to close.
Yet even as relief settles over the tribe, you remain watchful.
Such abundance is rarely unclaimed.
The forest is too rich. The river too generous. The land too perfect to have gone unnoticed.
Somewhere beyond the trees, others may already be watching.
Still—for now—you have found sanctuary.
A place between journeys. A place where choices will be made. A place from which your people’s future will unfold.
<div class="intro-notification good">
The tribe steadies. For now.
</div>
This will become your camp.
<div class="hub-buttons no-click-sfx">
<<button "Your home">>
<<goto "not your own">>
<</button>>
</div>
</div>...Or you will return to nothigness once more...<div class="screen-wrap screen-panel interact-screen">
<div class="screen-corner-return">
<span class="screen-return-chip">
<<link "Return" "Hub_1">><</link>>
</span>
</div>
<div class="screen-header">
<div class="screen-title">THE TRIBES</div>
</div>
<div class="screen-body">
<div class="screen-section-title">Known tribes</div>
<div class="screen-list tribes-list">
<<if $tribes and $tribes.length > 0>>
<<tribeList>>
<<else>>
<div class="screen-empty">
<div class="screen-empty-icon"></div>
<div class="screen-empty-title">No tribes known</div>
<div class="screen-empty-sub">You have not made contact with any other tribes yet.</div>
</div>
<</if>>
</div>
</div>
</div><<silently>>
<<set _pid = $personInfoId ?? $selectedPersonId ?? $personSelectedId ?? $activePersonId>>
<<set _p = null>>
<<if $people and $people.length and _pid>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _pid>>
<<set _p = $people[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if !$personInfoTab>><<set $personInfoTab = "friendly">><</if>>
<<if !$npcKnownNames>><<set $npcKnownNames = {}>><</if>>
<<if !$npcRevealedName>><<set $npcRevealedName = {}>><</if>>
<<set _defaultName = (_p ? (_p.name ?? "Unknown person") : "Unknown")>>
<<if _p and _p._source is "campNpc">>
<<if _pid is "npc_outcast">><<set _defaultName = "Outcast">><</if>>
<<if _pid is "npc_outcast_brother">><<set _defaultName = "The Brother">><</if>>
<</if>>
<<set _name = ($npcKnownNames[_pid] and $npcRevealedName[_pid]) ? $npcRevealedName[_pid] : _defaultName>>
<<set _desc = (_p ? (_p.description ?? "No description.") : "No description.")>>
<<set _role = (_p ? (_p.role ?? "Unknown") : "Unknown")>>
<<set _gender = (_p ? (_p.gender ?? "male") : "male")>>
<<set _isFemale = (_gender is "female") or (_p and _p.isFemale is true)>>
<<set _mood = (_p and _p.mood and _p.mood.state) ? _p.mood.state : "calm">>
<<set _obed = Number(_p ? (_p.obedience ?? _p.influence ?? 0) : 0)>>
<<if _isFemale>>
<<set _affLabel = "Love">>
<<set _aff = Number(_p ? (_p.love ?? _p.trust ?? 0) : 0)>>
<<else>>
<<set _affLabel = "Trust">>
<<set _aff = Number(_p ? (_p.trust ?? 0) : 0)>>
<</if>>
<<set _relationship = "Neutral">>
<<if _aff >= 80 and _obed >= 80>><<set _relationship = "Devoted">>
<<elseif _aff >= 60 and _obed >= 60>><<set _relationship = "Loyal">>
<<elseif _aff >= 60 and _obed < 30>><<set _relationship = "Affectionate but Defiant">>
<<elseif _aff < 30 and _obed >= 60>><<set _relationship = "Obedient (Cold)">>
<<elseif _aff < 30 and _obed < 30>><<set _relationship = "Hostile">>
<<elseif _aff >= 45>><<set _relationship = "Friendly">>
<<elseif _obed >= 45>><<set _relationship = "Compliant">>
<</if>>
<<set _roleDisplay = String(_role).replace(/_/g, " ")>>
<<set _moodDisplay = String(_mood).replace(/_/g, " ")>>
<<set _isCampNpc = _p and _p._source is "campNpc">>
<<set _roleLower = String(_roleDisplay).toLowerCase()>>
<<set _moodLower = String(_moodDisplay).toLowerCase()>>
<<set _showRole = _roleLower is not "camp npc" and _roleLower is not "unknown">>
<<set _showMood = _moodLower is not "none" and _moodLower is not "unknown">>
<</silently>>
<div class="person-sheet-shell">
<div class="person-sheet-card">
<div class="person-sheet-head">
<div class="person-sheet-name"><<print String(_name).toUpperCase()>></div>
</div>
<div class="person-sheet-body">
<div class="person-sheet-portrait-col">
<div class="person-sheet-portrait-frame">
<div class="tribeinfo-img person-sheet-portrait">IMG</div>
</div>
</div>
<div class="person-sheet-main">
<<if _showRole or _showMood>>
<div class="person-sheet-statgrid">
<<if _showRole>>
<div class="person-sheet-statbox">
<span class="k">Role</span>
<span class="v"><<print _roleDisplay>></span>
</div>
<</if>>
<<if _showMood>>
<div class="person-sheet-statbox">
<span class="k">Mood</span>
<span class="v"><<print _moodDisplay>></span>
</div>
<</if>>
</div>
<</if>>
<div class="person-sheet-desc-card">
<div class="person-sheet-section-label">Description</div>
<div class="person-sheet-desc-text"><<print _desc>></div>
</div>
<div class="person-sheet-bond-strip">
<div class="person-sheet-section-label">Bond</div>
<div class="person-sheet-bond-inline">
<div class="person-sheet-bond-name"><<print _relationship>></div>
<div class="person-sheet-meter-row">
<span><<print _affLabel>></span>
<strong><<print _aff>></strong>
</div>
<div class="person-sheet-meter-row">
<span>Obedience</span>
<strong><<print _obed>></strong>
</div>
</div>
</div>
</div>
</div>
<<if _isCampNpc>>
<div class="person-sheet-footer person-sheet-footer--camp">
<div class="person-sheet-action-row">
<<link "Return">><<goto "Interact">><</link>>
</div>
</div>
<<else>>
<div class="person-sheet-footer">
<div class="person-sheet-tabs">
<<if $personInfoTab is "friendly">>
<span class="person-sheet-tab is-active">Friendly</span>
<<link "Hostile">><<set $personInfoTab = "hostile">><<goto "Person_Info">><</link>>
<<else>>
<<link "Friendly">><<set $personInfoTab = "friendly">><<goto "Person_Info">><</link>>
<span class="person-sheet-tab is-active">Hostile</span>
<</if>>
</div>
<div class="person-sheet-action-row">
<<if $personInfoTab is "friendly">>
<<link "Talk">>
<<set $npcTalkOutput = "">>
<<run if (!State.variables.npcTalkMenu) { State.variables.npcTalkMenu = {}; } if (_pid) { delete State.variables.npcTalkMenu[_pid]; }>>
<<goto "Talk_1">>
<</link>>
<<if _isFemale>>
<<npcOncePerTurn _pid "sex">>
<<if _canUse>>
<span class="macro-button disabled is-wip person-sheet-disabled" title="Under construction">Sex</span>
<<else>>
<span class="macro-button disabled person-sheet-disabled" title="Already used this turn.">Sex</span>
<</if>>
<</if>>
<<link "Return">><<goto "Interact">><</link>>
<<else>>
<<link "Kill">><<goto "Person_Kill">><</link>>
<<link "Return">><<goto "Interact">><</link>>
<</if>>
</div>
</div>
<</if>>
</div>
</div><<silently>>
/* resolve active person id */
<<set _pid = $activePersonId ?? $selectedPersonId ?? $personSelectedId ?? $personInfoId>>
/* find person (optional, just for name in prose) */
<<set _p = null>>
<<if $people and $people.length and _pid>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _pid>>
<<set _p = $people[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<</silently>>
<div class="hub-textbox">
<<if _p>>
There is no long exchange of words.
The decision is made, and the moment passes quickly.
When it is over, <<print _p.name>> is gone—and the camp feels subtly changed by it.
<<else>>
Whatever happened here, there is no one left to confront.
<</if>>
</div>
<<silently>>
/* Remove from CAMP NPC list (this is what Interact shows) */
<<if $campNpcs and $campNpcs.length and _pid>>
<<set $campNpcs = $campNpcs.filter(n => n && n.id !== _pid)>>
<</if>>
/* Remove from generic people list too (keeps mirrors consistent) */
<<if $people and $people.length and _pid>>
<<set $people = $people.filter(p => p && p.id !== _pid)>>
<</if>>
/* Clear any active selection to avoid dangling references */
<<set $activePersonId = null>>
<<set $selectedPersonId = null>>
<<set $personSelectedId = null>>
<<set $personInfoId = null>>
/* Clear talk/menu state safely */
<<run (State.variables.npcTalkMenu && _pid) ? (delete State.variables.npcTalkMenu[_pid]) : 0>>
<<run (State.variables.npcTalks && _pid) ? (delete State.variables.npcTalks[_pid]) : 0>>
<</silently>>
<div class="hub-buttons">
<<button "Return">>
<<goto "Interact">>
<</button>>
</div><<silently>>
/* resolve active person id */
<<set _pid = $activePersonId ?? $selectedPersonId ?? $personSelectedId ?? $personInfoId>>
/* find person */
<<set _p = null>>
<<if $people and $people.length and _pid>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _pid>>
<<set _p = $people[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _gender = _p ? (_p.gender ?? "male") : "male">>
<<set _isFemale = (_gender is "female") or (_p and _p.isFemale is true)>>
<<if $sexGateOutput is null>><<set $sexGateOutput = "">><</if>>
<<if $sexGatePassed is null>><<set $sexGatePassed = false>><</if>>
/* if not female, bounce */
<<if !_isFemale>>
<<set $sexGateOutput = "<div class='npc-check npc-check-bad'><b>Unavailable.</b> This option is not available for this character.</div>">>
<</if>>
<</silently>>
<div class="hub-textbox">
<<if _p>>
You consider stepping closer to <<print _p.name ?? "her">>.
<<else>>
You hesitate—there’s no one selected.
<</if>>
<<if $sexGateOutput>>
<hr>
<<print $sexGateOutput>>
<</if>>
</div>
<div class="hub-buttons">
<<if _isFemale and !$sexGateOutput>>
<<button "Proceed">>
<<silently>>
/* consume once-per-turn usage right when you attempt */
<<set _turnNow = Number($turn ?? State.variables.turn ?? 0)>>
<<if !$npcOncePerTurn>><<set $npcOncePerTurn = {}>><</if>>
<<if !$npcOncePerTurn[_pid]>><<set $npcOncePerTurn[_pid] = {}>><</if>>
<<set $npcOncePerTurn[_pid]["sex"] = _turnNow>>
<</silently>>
<!-- AUTO at 80; otherwise CHA check -->
<<npcCheck _pid "charisma" 18 "silent" 80>>
<<silently>>
<<if $npcLastCheck.ok>>
<<set $sexGatePassed = true>>
<<set _flavor = "She reads your intent without flinching. After a beat, she gives a small nod—permission, on her terms.">>
<<set _line = ($npcLastCheck.auto)
? "<div class='npc-check npc-check-ok'><b>AUTO ACCEPT.</b> max(Relation/Obed) ≥ 80.</div>"
: "<div class='npc-check npc-check-ok'>Check: (Charisma " + $npcLastCheck.stat + " + d20 " + $npcLastCheck.roll + ") = " + $npcLastCheck.total + " vs DC " + $npcLastCheck.dc + ". <b>Success!</b></div>">>
<<else>>
<<set $sexGatePassed = false>>
<<set _flavor = "She doesn’t reject you outright—but her eyes warn you off. Not now. Not like this.">>
<<set _line = "<div class='npc-check npc-check-bad'>Check: (Charisma " + $npcLastCheck.stat + " + d20 " + $npcLastCheck.roll + ") = " + $npcLastCheck.total + " vs DC " + $npcLastCheck.dc + ". <b>Fail!</b></div>">>
/* small penalty on fail (Love for female) */
<<if _p>>
<<set _p.love = Number(_p.love ?? _p.trust ?? 0) - 1>>
<</if>>
<</if>>
<<set $sexGateOutput = _line + "<div class='npc-answer' style='margin-top:.5rem;'>" + _flavor + "</div>">>
<</silently>>
<<goto "Person_Sex">>
<</button>>
<</if>>
<<if $sexGatePassed>>
<<button "Continue">>
<<set $sexGateOutput = "">>
<<set $sexGatePassed = false>>
<<goto "Sexual_Intercourse">>
<</button>>
<</if>>
<<button "Return">>
<<set $sexGateOutput = "">>
<<set $sexGatePassed = false>>
<<goto "Person_Info">>
<</button>>
</div><<silently>>
<<set $q_outcast_brother_01_choice = null>>
/* Spend energy */
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
/* Pull current tile from map */
<<set _key = String($campX) + "," + String($campY)>>
<<set _tile = (setup.map && setup.map.tiles) ? setup.map.tiles[_key] : null>>
<<set _terrain = String(_tile && _tile.terrain ? _tile.terrain : "land")>>
/* Power option */
<<set _spark = setup.powerById("spark")>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 10) : 10)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
<<set _canSpark = _hasSpark and Number($belief ?? 0) >= _sparkCost>>
<</silently>>
<<run setup.playBattle()>>
''<div class="hub-textbox">
You search.
Not in haste. Not blindly.
"We were forced to split around here," she rasps, her voice a frayed cord of anger and pain. Her gaze drifts, losing focus.
"Sha-na... that fool.
He shoved me into this hollow, told me to be quiet. Ran off, making enough noise to wake the dead.
The wound was nothing... I could have fought..."
She bites down on her lip, a small, sharp act of will. A bead of blood wells up, a dark ruby against her pale skin, but she makes no sound.
You say nothing, offering no argument that the state you found her in would have left her in no condition to fight. Instead, you focus. On looking. Listening. Feeling.
The land gives answers— if you let it speak.
Broken ground. Bent growth. The uneven rhythm of flight giving way to exhaustion.
One man, running wounded, deliberately making a trail. Others behind him—moving at a pace that assumes the end is inevitable.
She remains where she is, a still figure in the undergrowth. Her eyes follow you, flickering from your face to the ground you examine, her expression a canvas of confusion and dawning understanding. She does not point. She does not interrupt.
She only watches— as you listen to the ground speak.
<<if _terrain is "mountains">>
The world tilts upward, the soft earth giving way to the bones of the mountain. The forest thins, replaced by fractured stone and stubborn, wind-scrubbed lichen.
Here, tracks are fleeting, but the mountain remembers in other ways. You read the story in the subtle signs: a recent scree-slide where a foot slipped, the pale scrape of a blade against granite, and a dark, wet smear where blood met unforgiving stone.
"Those scum," she murmurs at your side, her voice tight with old hatred. "Always up. Stone makes legs slow."
The wind is a constant companion here, a lonely moan that tears at your clothes. It carries sounds from below, shredding them into fragments—short, rough barks of laughter, words half-lost to the vastness, yet dripping with menace.
Together, you crest a broken ridge of shale. The world falls away into a deep, stone-walled chasm. Below, the ground narrows into a jagged shelf, a precarious wound in the mountainside.
Five hunters have him cornered.
Two stand closest, their spears leveled to form a cage of sharpened wood. The others hang back, their postures relaxed, blocking any hope of escape with their sheer presence.
They are in no hurry. They are certain of how this will play out.
The wounded man, who you assume is her brother, is pressed hard against the rock face, his chest heaving with each ragged breath. One arm hangs at a grotesque, useless angle, and a dark pool of blood slicks the stone beneath his feet. Yet, in his eyes, a fire still burns.
One of the hunters snorts, a sound of casual contempt. "No more climbing, Tiksi," he jeers. "You were always better at running than fighting. Would have made a poor chieftain," another adds, his voice laced with mock sympathy.
Another chuckles low.
"Drop the blade," the leader of the party commands, his voice flat and final.
The man, Tiksi, bares his teeth, a feral snarl. "Come," he spits, the words a wet rasp of defiance. "Then come."
The woman behind you goes rigid, her hands clenching into fists. Before you can move or speak, she draws a sharp, shuddering breath and unleashes a scream that tears through the thin mountain air. It is a sound of pure, undiluted fury.
"YOU TREACHEROUS SNAKES!"
<<elseif _terrain is "forest">>
The forest presses in, the air growing still and heavy between the dense trunks. The canopy above becomes a tangled ceiling, swallowing the light. Undergrowth lies torn and crushed, a clear sign of a desperate passage.
The trail tells its story in the language of panic. Turns too sharp for a running man. Steps too close together, stumbling. Control is bleeding into the dirt with every footfall.
She crouches, her fingers hovering just above a snapped branch, not daring to touch it. "They're herding him," she murmurs, her voice low and tight. "Five dogs to tree one cat. And they had the gall to call him the coward." Old contempt flares in her eyes, a brief, hot spark in the gloom.
You hear them before you see them.
Low, confident voices. A short, ugly burst of laughter.
The sound of men who know they have all the time in the world.
You part the final curtain of brush.
Five hunters stand in a loose ring between the thick trunks, their spears angled inward to form a cage of wood and steel. Two are positioned forward, the others watching the gaps, already cutting off any hope of escape.
Her brother, Tiksi, stands with his back to a broad, mossy oak, his only support. Blood seeps into the thirsty roots at his feet. His grip on his blade trembles, not just from exhaustion, but from a barely contained tremor of rage.
—but he still holds the blade.
One hunter tilts his head, a smirk playing on his lips. "Still on your feet, are you?" he says, a note of mock surprise in his voice.
"Gave you more credit than you deserved, Tiksi," another adds, his tone dripping with scorn. "Almost."
The outcasts's brother growls, the sound tearing from his throat through gritted teeth and ragged breaths. "I'll take one of you with me."
The hunters let out a collective, ugly chuckle. It's a sound of shared, casual cruelty.
At that moment, the woman behind you draws in a sharp, shuddering breath. Before you can react, she unleashes a scream that tears through the forest, raw and ragged with fury.
"YOU DOGS! GET AWAY FROM HIM!"
<<else>>
The land offers no shelter here. It's a vast, unforgiving expanse of scrub and rock under a pale, watching sky. The wind whispers across the open ground, carrying no secrets, only the promise of exposure.
"The land is too open here," she says, her voice a brittle attempt at fact. "It's only a matter of time before those bastards hunt him down like a rabbit." But the quaver in her tone betrays the terror clawing at her throat.
The story in the dirt is one of inevitability. Tracks converge from several directions, a net of pursuit drawn deliberately, methodically tight.
They have already closed the ring.
Five hunters stand around him, a loose constellation of death. They are spread wide, their spears held at a lazy, confident angle. Two speak quietly, their words snatched away by the wind, while the others watch the empty horizon—alert, patient, utterly certain of the outcome.
Her brother kneels on one knee, a posture forced by exhaustion, not submission. Blood darkens the parched dirt beneath him, a stark, final signature, but his eyes remain sharp, burning with a cold fire that is fixed on the man in front of him.
The leader gestures with his spear, a dismissive, almost lazy motion. "Should've stayed, died to the chieftain like a man," he says, his voice flat. "Now nobody will see you die. A dogs death Tiksi"
Another hunter nods, a slow, deliberate movement. "Lesson," he adds, his voice a low rumble. "For weak blood."
Her sister’s hands curl into tight, white-knuckled fists behind you. You can feel the coiled tension in her body, a scream building in her chest. It explodes from her, raw and ragged, tearing at the silence of the open plain.
"ADOHI! YOU TRAITOROUS WORM! DON'T YOU FEEL SHAME?! GET AWAY FROM HIM!"
<</if>>
Her scream tears through the moment, a raw shard of sound that hangs in the air long after it stops. The world freezes.
Her brother, Tiksi, is the first to move. His head, heavy with exhaustion, lifts slowly, painfully.
His eyes, burning with a desperate fire, shift past his tormentors, squinting into the brush where you stand. Confusion furrows his brow, then his gaze finds the woman behind you.
The fire in his eyes gutters out, drowned in a wave of profound, heartbreaking sadness. His shoulders slump, and a single, ragged word is torn from his lips.
"Sister..."
Then the hunters turn.
It is a single, sharp motion, a pack of wolves snapping their heads toward a new sound. Their relaxed postures vanish, replaced by a taut, predatory stillness. Their eyes find you first—a stranger, an unknown quantity. Then they slide past you to her.
Recognition spreads across their faces in ugly stages—first the confusion of the unexpected, then the dawning of an unpleasant memory, and finally, something harder. Something resentful. The easy confidence is gone, replaced by the cold calculus of a problem they thought took care of itself.
One of the men lets out a short, barking laugh of pure surprise.
"Shaman girl lives," the leader, Adohi, says. His voice is a low rumble, now devoid of its earlier mockery. "Thought the forest had her by now."
Another’s grip tightens on his spear, the knuckles turning white.
His gaze shifts from her to you. It's a quick, brutal assessment. His eyes flick from your weapon to your stance, to the set of your jaw. "And brings help," the leader mutters as he looks you over, analyzing you not as a threat, but as a new complication to be managed.
<img src="images/expeditions/BrotherQuest/brother1.png" alt="Amogus">
<<if $height < 160>>
The leader squints at you, his head tilting in a gesture of pure, dismissive assessment.
"Small," the leader says flatly.
A slow, ugly smile spreads across the face of one of the hunters, then another. It's a contagion of scorn, and it erupts into a burst of harsh, barking laughter that echoes through the clearing, stripping the moment of all tension and replacing it with mockery.
One of them, wiping a tear of mirth from his eye, elbows his neighbor. "Always knew she was too arrogant for a woman, attacking the chief like she did," he chokes out. "But I didn't think she'd be stupid enough to think she could take on five men with only half of one as her backup!"
Another adds, fighting to keep his own laughter in check, "Maybe she's hoping we'll all trip over the little one while she helps Tiksi run away!"
The girl behind you remains silent, but you can feel her stiffen. She bites down on her lip, a sharp, punishing act of will. A single, dark bead of blood wells up, a stark testament to the shame and fury boiling inside her. A thought, sharp and unwelcome, stabs at her through the haze of their mockery: Why? Why did you insist? Why just the two of you, while the others were sent to search elsewhere
<<elseif $height >= 190 and $height < 210>>
The leader's smirk vanishes. His gaze, once level with your chest, is forced to travel upward, a slow, grudging ascent. He shifts his weight, planting his feet wider in a purely instinctual response to your sheer presence.
"Big one," he says, his voice now devoid of humor, a low and careful rumble. "Grown strong. That means you're a hunter, at least."
The laughter in the clearing dies instantly. The men behind him spread out, their movements fluid and practiced. Their spears lower, no longer a casual display but a ready barrier. They aren't worried, but they are no longer treating this as a joke. They are now treating you as a threat.
<<elseif $height >= 210>>
The confident sneer on the leader's face dissolves. His jaw works, but the words die in his throat, strangled by the sheer, impossible reality of what he's seeing. He has to tilt his head back, far back, to meet your eyes, his own narrowing against the shadow you now cast over him.
A low murmur ripples through the other hunters. It's not laughter anymore. It's the sound of unease, of a superstition given form.
"That's..." one of them breathes, the words barely audible. "That's not right." He says it as if he's just seen a spirit walk out of the trees, something that violates the natural order.
The casual ring they formed breaks. The spacing widens into a desperate, uneven circle. Their spears lift higher, no longer angled in casual threat but held like brittle stakes against a coming avalanche. The knuckles on their hands are white.
No one is laughing. The mockery has been scoured away, leaving only a raw, animal terror. All focus is on you. You are not just a big target. You are a power personefied.
<<else>>
They measure you in a silence that feels heavy and deliberate. Their eyes flick over you—not as a man, but as a problem of geometry and physics. Reach, posture, weight. The leader's posture stays relaxed, a deliberate insult in itself.
"And what makes a man decide to throw his life away for nothing?" he asks, his voice laced with a casual venom. "Did she offer you her cunt?"
A wet, ugly snicker ripples through the group. They adjust their grips on their spears, the motion now eager rather than merely ready.
"I was always curious what she was like myself," one adds, leering openly in her direction.
"Wouldn't die for it though," another barks, and this time the laughter is more confident.
Behind you, the air grows taut with the girl's silent fury. You can almost feel the heat of it on your neck, but she remains perfectly still, a statue carved from rage.
<</if>>
The dynamic of the clearing shifts. It's not a retreat, but a recalibration. A foot scrapes softly on stone. A spear shaft is adjusted in a grip. Their collective focus, once a net cast over the brother, now tightens into a single, piercing point aimed squarely at you. You can feel it like a physical pressure, the weight of five pairs of eyes assessing, judging, waiting for you to make the first move.
Beside you, the Outcast girl's body coils like a spring. Her foot lifts, presses down half a pace forward—a single, desperate impulse toward her brother. Then it stills. She forces it to still.
Her jaw is a knot of bone and muscle, so tight you can almost hear the faint creak of her teeth grinding. Her eyes are not just burning; they are furnaces of banked fury and desperate hope, fixed on the scene before her. Every instinct, every fiber of her being, is screaming at her to act—to run, to scream, to throw herself into the fray.
But she doesn't. She swallows the storm inside her.
She waits. Her gaze flickers to you, a silent, desperate plea. In this moment, she has given you everything. The next move is yours.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-num'>1</span><span class='choice-text'>Break their line with brute force. (Strength)</span>">>
<<set $q_outcast_brother_01_choice = "str">>
<<goto "Quest1_BrotherSave_Resolve">>
<</button>>
<<if $height < 160>>
<span class="macro-button disabled" title="Too short!">
<span class="choice-num">2</span>
<span class="choice-text">Make them a promise of violence, spoken with absolute certainty. (Charisma/Intimidation)</span>
</span>
<<else>>
<<button "<span class='choice-num'>2</span><span class='choice-text'>Make them a promise of violence, spoken with absolute certainty. (Charisma/Intimidation)</span>">>
<<set $q_outcast_brother_01_choice = "cha">>
<<goto "Quest1_BrotherSave_Resolve">>
<</button>>
<</if>>
<<button "<span class='choice-num'>3</span><span class='choice-text'>Use your eyes, not your hands. Find the weakness in their approach. (Wisdom)</span>">>
<<set $q_outcast_brother_01_choice = "wis">>
<<goto "Quest1_BrotherSave_Resolve">>
<</button>>
<<if _canSpark>>
<<button "<span class='choice-num'>4</span><span class='choice-text'>Remind them what happens when you poke fire (Use Spark) (Spark: <<print _sparkCost>> Belief) — Auto success</span>">>
<<set $q_outcast_brother_01_choice = "spark">>
<<goto "Quest1_BrotherSave_Resolve">>
<</button>>
<<else>>
<span class="macro-button disabled" title="<<print _hasSpark ? ('Need ' + _sparkCost + ' Belief.') : 'You have not acquired Spark.'>>">
<span class="choice-num">4</span>
<span class="choice-text">Remind them what happens when you poke fire (Use Spark) (Spark: <<print _sparkCost>> Belief) — Auto success</span>
</span>
<</if>>
</div><<silently>><<set _qid = "q_outcast_brother_01">>
/* Choice FIRST (you were using it before it existed) */
<<set _choice = $q_outcast_brother_01_choice ?? "wis">>
/* Base DC by approach */
<<set _baseDC = 14>>
<<if _choice is "str">><<set _baseDC = 13>>
/* NEW: if short (<=160), brute force lands faster — make STR check easier by 2 */
<<if Number($height ?? 0) <= 160>><<set _baseDC = _baseDC - 2>><</if>>
<<elseif _choice is "wis">><<set _baseDC = 13>><</if>>
/* Spark */
<<set _spark = setup.powerById("spark")>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 20) : 20)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
/* Pick stat key */
<<set _statKey = (_choice is "str") ? "strength" : ((_choice is "cha") ? "charisma" : "wisdom")>>
/* Roll */
<<set _roll = random(1, 20)>>
<<set _stat = Number(State.variables[_statKey] ?? 0)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _baseDC)>>
/* Spark: if owned + can pay, auto-success */
<<if _choice is "spark">>
<<if _hasSpark and Number($belief ?? 0) >= _sparkCost>>
<<set $belief = Number($belief ?? 0) - _sparkCost>>
<<set _ok = true>>
<<set _roll = 20>>
<<set _statKey = "spark">>
<<set _stat = 0>>
<<set _total = 20>>
<<else>>
/* fail-safe: fall back to wisdom if routed here incorrectly */
<<set _choice = "wis">>
<<set _statKey = "wisdom">>
<<set _roll = random(1,20)>>
<<set _stat = Number(State.variables.wisdom ?? 0)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _baseDC)>>
<</if>>
<</if>>
<<set $questLastCheck = {
ok:_ok,
statKey:_statKey,
stat:_stat,
roll:_roll,
dc:_baseDC,
total:_total,
choice:_choice
}>>
/* find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and ($quests[_i].id is _qid)>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set $q_outcast_brother_01_resolvedTurn = $turn>>
<<set $q_outcast_brother_01_resolvedStatus = $questLastCheck.ok ? "complete" : "failed">>
/* update quest status */
<<set _newStatus = $questLastCheck.ok ? "complete" : "failed">>
<<if _qIndex >= 0>>
<<set $quests[_qIndex].status = _newStatus>>
<<set $quests[_qIndex].markerRevealed = false>>
<</if>><</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if $questLastCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print $questLastCheck.statKey>> + d20 vs DC</span>
<span class="value"><<print $questLastCheck.total>> / <<print $questLastCheck.dc>></span>
</div>
<<if $questLastCheck.choice is "spark">>
<div class="result-line bad">
<span class="label">Belief spent</span>
<span class="value">-<<print _sparkCost>></span>
</div>
<</if>>
</div>
<<if $questLastCheck.ok>>
Your choice lands— like a stone thrown into still water.
<<if $questLastCheck.choice is "str">>
<<if Number($height ?? 0) <= 160>>
Their laughs mean nothing. Your expression doesn't even change.
It takes only a moment—and you are gone. The space between you vanishes, and you are right next to them.
“Wha—” One of them starts to say, but before the sound can fully form, you move. Your hand shoots out, fingers tangling in his greasy beard.
You wrench down, using his own body weight to pull him into your rising fist. There is a sickening, wet crunch.
When his body hits the ground a moment later, what meets the dirt first isn't a face, but a grotesque canvas of gore that was once a face. “Fast,” says the leader, his voice a strangled whisper.
His knuckles are white where he grips his spear, his eyes still wide with the shock of your impossible speed. One of the other hunters, the one who laughed loudest, stumbles backward, his feet tangling in a root as he scrambles away from you.
Even the girl behind you looks shocked, her mouth slightly agape. But the shock in her eyes quickly melts, replaced by a dawning, hopeful surprise.
<<else>>
There is no negotiation. There is only motion.
You explode forward, not like a man, but like a landslide. The distance vanishes.
You are inside their guard, close enough to smell the sour sweat on their skin, close enough that their spears are suddenly too long, too clumsy. They must choose between stabbing you and impaling the man next to you.
Your shoulder slams into the nearest hunter. You feel the wet crack of his ribs giving way, a sound swallowed by his grunt of pain.
Before he can fall, your forearm drives up and out, catching the second man under the chin. His head snaps back with a sickening pop, his jaw dislocated, his eyes rolling back in his head.
Your sheer weight drives into the center of their formation, a battering ram of flesh and bone. The ring shatters. One spear, wielded by a man stumbling back in panic, scrapes across your ribs.
<<if Number($endurance ?? 0) >= 5>>
It doesn't even break your skin, a glancing blow that feels more like a shove than a wound.
<<else>>
It breaks skin, a hot, stinging line of fire, but it's a gnat's bite compared to the storm you've become.
<</if>>
Another spear jerks wide as its owner trips over the feet of the man you just crippled. The hunters weren't built for this. They were built for the chase, for the slow kill. They were not built to stand against a force of nature.
<</if>>
<<elseif $questLastCheck.choice is "cha">>
You speak like someone who has already counted the bodies. Not loud.
Not pleading. Certain.
Your voice isn't loud. It doesn't need to be.
It carries the cold, absolute certainty of a winter dawn that promises no warmth. It is a statement of fact, not a threat.
“You can walk away,” you say. “Right now.”
One of them laughs—a short, ugly bark of sound that is immediately strangled by the silence that follows. Another doesn't laugh at all.
He just stares, the smirk wiped clean from his face, replaced by a dawning, animal caution. Your hand moves, slow and deliberate, pointing a finger at the wounded man, Tiksi.
“That one,” you say, your tone flat, final, “is not worth dying for.” The words do what their sharpest spears cannot: they force a choice.
The logic of their situation, so clear just moments ago, is now poisoned with doubt. The tight ring of spears falters.
Eyes dart from their leader to each other, then to the treeline behind them. The bravado is gone, replaced by the chilling calculus of self-preservation. Nobody wants to be the first to break.
<<elseif $questLastCheck.choice is "wis">>
You do not rush. You become the stillness in the center of their tense, shifting circle.
Your mind is a hunter's snare, waiting for the right moment to spring. You watch their feet.
The way the two in front rock on the balls of their feet, hungry for the finish. The way the three in the back rest the butts of their spears on their hips, a lazy, confident posture.
You see the gaps they think don't matter—the space between the second man's spear and the third man's reach, a lane they believe is covered by numbers, but you see as an open path. You wait for the moment certainty becomes pattern.
A glance from the leader toward the girl, a flicker of lewd confidence. In that instant, the man to his left mirrors the distraction, his weight shifting, his spear dipping just an inch.
That is the moment. Then you move.
Not fast—precise. Your movements carry no needless strength, only the brutal economy of a predator.
You flow through the gap you identified. Your hand strikes, not a punch, but a precise, knife-edge blow to the side of the first hunter's neck.
The place where life flows. His eyes go wide, then vacant.
He falls without a sound, a puppet with its strings cut. Before his neighbor can process the fall, you are already turning.
Your leg sweeps low, not a kick, but a scythe aimed at the side of his knee. The joint buckles with a wet, cartilaginous pop.
He doesn't scream at first; the shock is too great. He simply collapses, his spear clattering uselessly to the ground.
Then the agony hits, and a raw shriek tears from his throat. You look at the leader next.
He is no longer leaning. He is three steps back, the distance created in a heartbeat of pure fear.
His spear is no longer a prop; it is a lifeline, held in a white-knuckled grip, its point aimed squarely at your heart. The lazy contempt in his eyes has been scoured away, replaced by the cold, sharp focus of a man who suddenly understands he is hunting something that hunts back.
<<else>>
You open your hand. A tiny flame blooms in your palm, a silent, silver tear in the fabric of the world.
It is not fire— not the crackling, consuming thing of campfires. It is the memory of it, colder and more terrible.
The men see it, and their jeers die in their throats. They hesitate the way animals do when the night suddenly grows teeth and claws.
Light, pale and stark, spills across their faces, carving new landscapes of fear from their smug expressions. A wave of dry, unnatural heat washes over them, making the wooden shafts of their spears creak and their hands twitch away from the metal points.
Someone swallows, the sound loud in the sudden silence. Someone mutters a prayer to a forest spirit.
The Outcast girl behind you goes very still, a statue of shock and confusion. “What are you—” she begins, her voice a choked whisper.
<img src="images/expeditions/BrotherQuest/brother2.png" alt="Amogus">
But before she can finish, the main flame shatters. Not with a sound, but with a silent, violent purpose.
Two smaller embers hatch from it and hang in the air for a fraction of a second. Then they move.
Not like thrown things, but like thoughts given form, unerring and impossibly fast. They strike the two hunters nearest to you.
There is no explosion, only a terrible, silent blossoming. The silver fire clings to them, and in the space of a single heartbeat, they are engulfed.
Their screams are raw and animal, cut short as the fire devours the very air from their lungs. A third ember darts from your palm.
Another hunter, his eyes wide with terror, tries to dodge. He moves like a man in a nightmare, slow and clumsy.
It doesn't matter. The flame finds him, and he too becomes a shrieking torch.
He stumbles, falling to the ground, trying to roll, to smother the impossible fire that eats at his flesh. It is a futile, desperate dance that ends in silence and a spreading pool of ash.
And then, as suddenly as it began, it is over. Four men lie in smoking heaps on the ground.
Only the leader is left standing, frozen in place, his face a mask of pure, undiluted horror. He is painted in the ghastly, flickering light of his burning comrades, a lone survivor left to bear witness to a power he cannot comprehend.
<</if>>
Her brother surges forward from the tree, a final, desperate burst of will. It is not a heroic charge; it is the last thrash of a drowning man. His blade, a sliver of desperate light, flashes too close to the nearest hunter's face, forcing the man to stumble back. He is not fighting to win, but to force a single, gasping breath of space into their suffocating circle. The ring breaks.
The hunters, or what's left of them, retreat—not in a panicked flight, but in a shocked, stumbling withdrawal. They pull back into a rough half-circle, their spears no longer offensive tools but trembling barriers.
Their eyes are sharp, darting between you and the wounded man, measuring you no longer as prey, but as a storm they were never warned about. And in that moment of their profound uncertainty, you take the ending away from them.
You don't need to raise a weapon. You simply take a single, deliberate step forward, and the world seems to hold its breath.
The brother sags against you, his entire weight a testament to his spent strength. His breath is a ragged, wet sound in your ear.
He is alive. Behind you, the Outcast girl makes a sound— not a sob, not a word.
It is something smaller, something fragile. A quiet, shuddering gasp that slips out when a spine, held taut for far too long, finally stops breaking.
The hunters don't dare press you, not anymore. They back away in careful, measured steps, unwilling to turn their backs on you.
The leader does his best to hide his fear, but it leaks from him like water from a cracked pot—a tremor in his hand, a flicker in his eyes. As you prepare to take another step, he turns and melts into the trees.
<<if $questLastCheck.choice is "spark">>
His men don't follow; they flee. They scatter like leaves in a gale, scrambling over each other in their terror, abandoning all pretense of order. You are left with the silence and the smell of ozone and burnt flesh.
<<else>>
His men follow suit, backing away in a rough formation, their spears still pointed vaguely in your direction until the forest swallows them. You have a feeling this isn't over.
<</if>>
<<silently>>
/* ===========================
QUEST WRAP-UP + NPC ADD (NORMAL BEHAVIOR) =========================== */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* Mark quest resolved */
<<set $questFlags["q_outcast_brother_01_done"] = true>>
<<set $questFlags["q_outcast_brother_01"] = true>>
/* Stop tracking this quest if it was tracked */
<<if $trackedQuestId is "q_outcast_brother_01">>
<<set $trackedQuestId = null>>
<</if>>
/* Add Brother via your helper (adds to $campNpcs) */
<<run setup.campNpcs.addOutcastBrother()>>
/* Force immediate mirror so Interact/Person_Info sees him now */
<<run setup.people.syncCampNpcsToPeople()>>
/* Apply rewards to canonical $people entries (no fragile loops) */
<<run (function () {
const out = setup.people.upsert("npc_outcast", {});
out.love = Number(out.love ?? 0) + 50;
out.obedience = Number(out.obedience ?? 0) + 30;
const bro = setup.people.upsert("npc_outcast_brother", {});
bro.trust = Number(bro.trust ?? 0) + 30;
bro.obedience = Number(bro.obedience ?? 0) + 30;
})();>>
/* IMPORTANT: Do NOT set $activePersonId/$personInfoId here.
That was causing other passages to "stick" to the brother. */
<</silently>>
<div class="result-list">
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
<<else>>
You commit.
For a single, perfect heartbeat, it feels like it might be enough.
Then, the world tilts. A misstep. A word that lands like a stone instead of a feather. A calculation that shatters on the hard rock of reality.
Five men don't need courage when they have routine. Their movements are a well-worn path, and they simply walk it, their spears moving with practiced, brutal efficiency.
A spear shaft slams into your chest, not to pierce, but to shove, stealing the ground you needed. Another glides past, a silent wall of wood, cutting off the brother's desperate lunge and herding him back, back toward the tree and the final, waiting point of no return.
His eyes find yours across the sudden, impossible distance. For a flicker of a second, there is hope—a desperate, bright spark. Then it vanishes. A spear slides into his chest. Not a violent thrust, but a smooth, almost casual insertion.
Efficient. Quiet. Final.
The light in his eyes goes out, replaced by a vacant surprise.
A sound tears from your throat. It is not a war cry. It is the sound of something breaking. The world becomes a red haze. The spear in front of you is just wood, and you break it. The man holding it is just flesh, and you break him too. Another follows, his face a mask of sudden terror before he is erased. You are not fighting. You are unmaking.
When the haze clears, you are still standing. The air is thick with the coppery scent of blood. Your hands are slick with it, but it is not yours. And the man you came to rescue is a still form against the tree.
The Outcast girl behind you makes no sound. She does not fall or scream.
She simply goes very, very still. It's as if a cord has been cut inside her, and all her strings have gone slack.
Her eyes are fixed on her brother, but they see nothing at all. The remaining hunters don't even think of pressing.
They flee, scrambling over roots and each other, crashing through the undergrowth. They are running from a grief that has teeth and claws.
But they are gone. And you are still here.
And the brother is dead.
<<silently>>
/* Quest is already marked failed above; just ensure it won't be re-offered */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags["q_outcast_brother_01_done"] = true>>
<<set $questFlags["q_outcast_brother_01"] = true>>
<<if $trackedQuestId is "q_outcast_brother_01">>
<<set $trackedQuestId = null>>
<</if>>
<</silently>>
<div class="result-list">
<div class="result-line bad">
<span class="label">Task</span>
<span class="value">Failed</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Return to camp</span>">>
<<run setup.stopBattle ? setup.stopBattle() : SimpleAudio.select("Battle").stop()>>
<<goto "Hub_1">>
<</link>>
</div><<silently>>
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
/* ===========================
Moving Hill – Expedition #1 (ONE-TIME) Pure stat check (wisdom >= 5) Updates quest + sets relocation trigger flag =========================== */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_moving_hill_01">>
/* ---- One-time guard: if already done, don't allow repeat ---- */
<<if $questFlags["q_moving_hill_01_exp1_done"]>>
<<set _alreadyDone = true>>
<<else>>
<<set _alreadyDone = false>>
<</if>>
/* Find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and (String($quests[_i].id) is _qid)>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
/* If already done, make sure the quest can't be used as an expedition again */
<<if _alreadyDone and _qIndex >= 0>>
<<set $quests[_qIndex].markerRevealed = false>>
<<set $quests[_qIndex].targetX = null>>
<<set $quests[_qIndex].targetY = null>>
<<set $quests[_qIndex].expeditionPassage = null>>
<</if>>
/* Stop here if done (prevents rerolling check + reapplying updates) */
<<if _alreadyDone>><<goto "Hub_1">><</if>>
/* ---- Pure stat check ---- */
<<set _ok = (Number(State.variables.wisdom ?? 0) >= 5)>>
<<set $questLastCheck = {
ok:_ok,
statKey:"wisdom",
stat:Number(State.variables.wisdom ?? 0),
dc:5,
roll:0,
total:Number(State.variables.wisdom ?? 0)
}>>
/* Update quest text (keep it ACTIVE, but REMOVE expedition repeat) */
<<if _qIndex >= 0>>
<<set $quests[_qIndex].name = "The Moving Mountain">>
<<if $questLastCheck.ok>>
<<set $quests[_qIndex].desc = "You returned to the site with Rutvig. The ‘hill’ was gone… but the clearing itself felt wrong—too clean, too even, as if something massive once pressed the land flat. If it moved once, it might move again.">>
<<set $quests[_qIndex].objective = "Perhaps you might find the "hill" again. Perhaps not. Time will tell.">>
<<else>>
<<set $quests[_qIndex].desc = "You returned to the site with Rutvig. There was nothing there—no hill, no tracks, only empty ground and growing doubt. Still… the story won’t leave you alone.">>
<<set $quests[_qIndex].objective = "Relocate the tribe again and see if anything changes in the western lands.">>
<</if>>
<<set $quests[_qIndex].status = "active">>
<<set $quests[_qIndex].markerRevealed = false>>
/* ✅ IMPORTANT: remove the expedition hook so it can't be repeated */
<<set $quests[_qIndex].targetX = null>>
<<set $quests[_qIndex].targetY = null>>
<<set $quests[_qIndex].expeditionPassage = null>>
<</if>>
/* Flag for a future major event that should trigger on the NEXT relocation */
<<set $questFlags["q_moving_hill_01_waitRelocate"] = true>>
/* Mark this expedition step as done forever */
<<set $questFlags["q_moving_hill_01_exp1_done"] = true>>
/* Optional: keep it highlighted */
<<set $trackedQuestId = _qid>>
<</silently>>
''<div class="hub-textbox">
After deciding to move camp recently, you spend some of your free time following up on the story one of the scouts told you.
With him and a few hunters in tow, you have him lead you to the place where he claims he saw the disappearing hill months ago.
<br><br>
And just as he said, there isn’t really anything to see here.
<br><br>
Some of the hunters whisper among themselves that old Rutvig has finally gone mad—that he’s wasting the chieftain’s time.
<br><br>
<div class="result-list">
<<if $questLastCheck.ok>>
<div class="result-line good">
<span class="label">Wisdom check</span>
<span class="value">PASSED</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Wisdom check</span>
<span class="value">FAILED</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom vs threshold</span>
<span class="value"><<print $questLastCheck.stat>> / <<print $questLastCheck.dc>></span>
</div>
</div>
<br>
<<if $questLastCheck.ok>>
…But you <i>do</i> notice a few strange things.
<br><br>
The clearing is quite large—unnaturally so.
The grass that covers it also seems shorter than the grass farther out,
and the few trees along the edges look like little more than saplings…
<</if>>
<br><br>
…At any rate, you doubt you’ll find anything here anytime soon.
You head back to camp with little to show for the venture.
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</link>>
</div><<silently>>
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
/* ===========================
Moving Hill – Expedition #2 (FINAL) - Completes quest - Rewards: +5 Zeal, +50 Belief - Removes expedition hook so it can't be repeated =========================== */
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_moving_hill_01">>
/* One-time guard (just in case) */
<<if $questFlags["q_moving_hill_01_final_done"]>>
<<goto "Hub_1">>
<</if>>
/* Rewards */
<<set _dZeal = 5>>
<<set _dBelief = 50>>
<<set $zeal = Number($zeal ?? 0) + _dZeal>>
<<set $belief = Number($belief ?? 0) + _dBelief>>
/* Find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Complete quest + clear expedition anchor */
<<if _qIndex >= 0>>
<<set $quests[_qIndex].status = "complete">>
<<set $quests[_qIndex].markerRevealed = false>>
/* Remove expedition hook so it can't be repeated */
<<set $quests[_qIndex].targetX = null>>
<<set $quests[_qIndex].targetY = null>>
<<set $quests[_qIndex].expeditionPassage = null>>
<</if>>
/* Flags */
<<set $questFlags["q_moving_hill_01_final_done"] = true>>
<<set $questFlags["q_moving_hill_01_waitRelocate"] = false>>
/* Clear tracking highlight */
<<if $trackedQuestId is _qid>>
<<set $trackedQuestId = null>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You set out again—this time with your target seen and certain. After a few hours of travel, you finally spot it.
<img src="images/expeditions/MovingHillQuest/StrangeMountain.png" alt="Amogus">
“…It’s the very same one… how did it get here?” Rutvig says.
And true to Rutvig’s word, it looks exactly as he described it: unnaturally symmetrical, its slopes too even, its edges too smooth. Grass covers it in a way that almost looks <i>placed</i> there—planted, not grown.
And yet nothing about it is concrete proof. Nothing you can point to and say <i>it wasn’t always here</i>, that it isn’t simply a strange, oversized hill.
You step closer.
The slope is too steep for most men to climb easily. You reach out and trace your hand along the edge. Beneath the grass and moss, your fingers find stone—smooth, worked smooth, as if shaped long ago.
The instant you touch it, the ground begins to rumble.
Not a distant tremor—something close. Something waking. Like the first warning of an earthquake.
Your men tighten their grips and raise their spears. Instinct screams at them to run… but they don’t.
Because you’re still standing there. Because you haven’t moved.
And then you feel it—something faint, almost imperceptible. A presence brushing against you. It slips into you as easily as breath, becomes a part of you, and settles somewhere deep inside, as if it had always belonged there.
The rumbling stops.
You turn to your men, and casually inform them that the mountain wont be causing any more issues.
The certainty in your voice is simple and absolute—and they believe you at once. You order them to head back to camp.
As you follow after them, you glance back one last time at the strange hill.
You don’t know how you know. You don’t know <i>why</i>. But you know it as surely as you know your own name:
It won’t be moving anymore.
<div class="result-list">
<div class="result-line good">
<span class="label">Belief gained</span>
<span class="value">+<<print _dBelief>></span>
</div>
<div class="result-line good">
<span class="label">Zeal gained</span>
<span class="value">+<<print _dZeal>></span>
</div>
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</link>>
</div>''<div class="hub-textbox">
The path back is easier to follow than you expected.
Easier, perhaps, than it should be.
You never marked it. Never gave the place much thought after leaving it behind. And yet your feet seem to know where to go, carrying you through brush and stone with a certainty that leaves little room for doubt. When at last the trees part, you find it waiting.
The tree.
Just as vast as in your dream.
And at its roots lies the body.
Not fresh. It has been too long for that. Time and the wild have already done their work, leaving behind something shrunken and half-taken by the earth. Nearby hangs the carcass of the beast you slew, its remains caught high among the branches where no man could have placed them without effort.
For a while, you simply stand there.
The forest is quiet.
Too quiet.
No animals. No sound of birds.
Then, at the foot of the roots, half-covered by soil and creeping vine, you see it.
A skull.
Human.
His.
The man who attacked you. The man who spilled your blood before you ended him.
Its bone is stained dark where root and soil have pressed into it. Thin tendrils wind through the cracks and empty sockets alike, as though the thing has been feeding, or been fed upon, for a very long time.
And somehow, as you stare at it, you know one thing with absolute certainty.
It does not belong here.
Not anymore.
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Take the skull</span>">>
<<goto "Quest_Relic_CorruptTree_Take">>
<</button>>
<<button "<span class='choice-text'>Burn the remains and leave</span>">>
<<goto "Quest_Relic_CorruptTree_Burn">>
<</button>>
</div><<silently>>
<<set _spark = setup.powerById("spark")>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 20) : 20)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
<<set _canSpark = _hasSpark && Number($belief ?? 0) >= _sparkCost>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags.corruptSkullBurnResolved>>
<<if _canSpark>>
<<set $belief = Number($belief ?? 0) - _sparkCost>>
<</if>>
<<run setup.corruptSkull.destroyRelic()>>
<<run setup.corruptSkull.finishQuest(
"You burned the blood-marked tree and left the place behind. Whatever had been growing there was denied the chance to follow you home.",
"You destroyed the Corrupt Tree before its relic could be claimed."
)>>
<<set $questFlags.corruptSkullBurnResolved = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<if _canSpark>>
You look at the tree for a long moment.
Then, slowly, you raise one hand toward it, palm open.
Three small white flames flicker into being above your skin. Even at that size, they are enough to push back the weight hanging over this place. For a brief moment, the air feels lighter, cleaner, as though whatever clings to the roots recoils from their presence.
Then the flames drift free.
They split apart as they move, becoming smaller still, tiny pale sparks that float toward the tree.
Their size is a deception.
The moment they touch bark, root, and flesh, the whole thing erupts.
Fire races across the trunk. The body at its roots blackens and curls. Above, the hanging carcass is swallowed in flame. Vines shrivel. Sap hisses. Smoke billows upward in a sudden choking wave as the blaze consumes all three alike.
For a moment, you think you hear a faint scream buried beneath the crackling.
Or perhaps only imagine it.
And for just an instant, you feel as though some smallest part of you is being burned away with it.
Yet perhaps that part was never truly yours any longer.
And if it was, then perhaps it is better for it to disappear here.
When at last the flames begin to die, little remains but blackened wood, ash, and smoke.
The pull that brought you back is gone.
You turn away without looking back.
<<else>>
You gather wood in silence.
Not because you understand what happened here, but because you understand enough. Some places are wrong. Some dead should be burned. Some things are better ended before they are allowed to linger.
The flames take slowly.
Too slowly.
The body blackens first. The vines curl in on themselves. The hanging carcass above spits grease and ash as the fire climbs higher. Even then, the tree does not properly catch. It only smolders, dark sap hissing where the flames bite deepest.
For a while, the smoke is thick enough to sting your eyes.
You stay until there is nothing left to do.
When at last you turn away, the place looks changed, but not clean.
Not truly.
Still, whatever had drawn you back here has faded.
And that is enough.
<</if>>
<div class="result-list">
<<if _canSpark>>
<div class="result-line bad">
<span class="label">Spent</span>
<span class="value">-<<print _sparkCost>> Belief</span>
</div>
<</if>>
<div class="result-line good">
<span class="label">Effect</span>
<span class="value">Corrupt Skull chain ended</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Leave the ashes behind</span>">>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags.corruptSkullTakeResolved>>
<<run setup.corruptSkull.grantBase()>>
<<run setup.corruptSkull.finishQuest(
"You tore the skull free from the roots and carried it back to camp. Whatever had been feeding there did not stay with the tree.",
"You claimed the Corrupt Skull."
)>>
<<set $questFlags.corruptSkullTakeResolved = true>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You crouch beside the roots and reach for the skull.
The moment your fingers touch it, a chill shoots through your arm, so sudden and sharp it nearly makes you pull away. The roots resist at first, clinging to the bone as though reluctant to surrender it. You have to wrench it free with more force than should be necessary.
One root tears.
Then another.
Wet strands snap back into the earth.
For an instant, you could swear the whole tree groans.
When at last the skull comes loose, you hold it in both hands and stare.
It is lighter than it should be.
Too light.
Thin roots still cling to it. Small vines coil around the jaw and crown. Dark stains run through the cracks in the bone like old veins. It is ugly. Unclean. Wrong.
And still, you do not throw it away.
Something in you hesitates.
No.
Not hesitation.
Recognition.
It feels strangely natural in your hands, as though you are not taking something foreign to you, but reclaiming something that had been left behind.
In the end, you wrap the thing and bring it back with you.
That night, even before anyone has the chance to truly look at it, the camp feels different.
Subtly, perhaps.
But different all the same.
The air is heavier. Voices lower without meaning to. Fires crackle a little too loudly in the silence between them. No one says anything at first, yet more than one gaze lingers a moment too long in your direction, then away again.
Only time will tell whether that feeling will pass.
Somehow, you doubt it.
<div class="result-list">
<div class="result-line good">
<span class="label">Gained relic</span>
<span class="value">Corrupt Skull</span>
</div>
<div class="result-line bad">
<span class="label">Warning</span>
<span class="value">Relic events can now begin to fire</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</button>>
</div><<set $energy = Math.max(0, Number($energy || 0) - 1)>>
''<div class="hub-textbox">
<<if _terrain is "mountains">>
The land tightens into stone and incline as you close in.
Footing turns treacherous. Loose shale skitters downslope with every step.
Their trail is thin—but the mountains remember. Scraped rock. Shattered stone. A dark smear where blood met pale granite and slid downward.
They were driven uphill.
Sound behaves strangely here. Voices echo where they shouldn’t, then vanish where they should carry.
You crest the ridge.
Below, a narrow shelf cuts across the slope.
Five hunters wait along the stone. Two stand forward, spears braced. The others hold higher ground, watching for movement.
They aren’t shouting.
They don’t need to.
Their people press close behind them— thin, wary, sheltering against the rock.
They believe the height will save them.
<<elseif _terrain is "forest">>
The forest closes ranks as you advance.
Branches hang broken. Underbrush lies crushed beneath hurried feet.
The trail speaks clearly now— sharp turns, paths chosen for speed rather than sense.
They knew they were being followed.
You hear them before you see them.
Low voices. Short laughs.
Men who think they still have time.
You part the brush.
Five hunters form a loose line between the trees. Two step forward. The others angle outward, quietly sealing off every easy path through the trunks.
Behind them, the rest of the tribe clusters tightly— silent, watching, ready to scatter if the line breaks.
They chose this ground carefully.
<<else>>
There is nowhere to hide here.
Open land, broken just enough to slow a group on the move. Tracks converge from several directions.
They’ve already taken positions.
Five hunters stand spaced wide, spears raised. Two speak in low tones. The others watch the flanks with practiced patience.
Behind them, their people wait— exposed, exhausted, with nowhere left to run.
They stopped because they had no better choice.
<</if>>
<<if $height < 160>>
The nearest hunter squints, lips tightening.
“Short,” he mutters.
His gaze slips past you—to the men behind you.
No one smiles.
Hands tighten on spear shafts. No one relaxes.
<</if>>
“We don’t want trouble,” the man in front says at last. “We came for food.”
His words are familiar enough for your hunters to follow, though the rhythm is wrong— shaped by another land.
He hesitates, then continues.
“We ran,” he says. “From the Unmoving. By the great lake.”
A murmur ripples through his people.
“They don’t travel,” he adds. “They don’t trade. They don’t forget.”
His jaw sets.
“They pushed us out. Claimed one of our hunters killed a deer that belonged to their chief?”
He then mutters, a bit more quietly to himself
"How does one own an animal in the forest?"
<img src="images/expeditions/TutorialQuest/tutorial.png" alt="Amogus">
He then gestures behind him.
“We left. Walked until our legs failed us. Until this was the only ground left.”
Slowly, he lowers his spear.
“We’ll give what we have,” he says. “Stone. Tools. Hides.”
A pause.
“Just let us keep our food.”
Some of your hunters shift.
A few watch the strangers with sympathy— seeing too much of their own past in hollow eyes and thin frames.
Others smirk, savoring the simple relief of not being the weakest here.
Many do not react at all.
Their thoughts don’t matter. Only yours does. The moment stretches.
The tribe waits for you.
</div>''
<div class="hub-buttons">
<<button "Agree to his deal">>
<<set $tutorialOutcome = "deal">>
<<goto "Quest_Tutorial_Resolve">>
<</button>>
<<button "Attack and take everything">>
<<set $tutorialOutcome = "attack">>
<<goto "Quest_Tutorial_Resolve">>
<</button>>
<<button "Convince them to join your tribe">>
<<set $tutorialOutcome = "absorb">>
<<goto "Quest_Tutorial_Resolve">>
<</button>>
</div><<silently>>
/* Did the prior resolution increase pops?
- Attack success: gained pops
- Absorb success: gained pops
- Deal: no pops change
- Attack fail: lost pops
- Absorb fail: no pops gain (but zeal/stability hit)
*/
<<set _gainedPops =
(($tutorialOutcome is "attack" or $tutorialOutcome is "absorb")
and $questLastCheck and $questLastCheck.ok)
>>
/* Record completion so Kael's follow-up quest can key off it later. */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags["q_tutorial_end_complete"]>>
<<set $questFlags["q_tutorial_end_complete"] = true>>
<<set $questFlags["q_tutorial_end_completed_turn"] = Number($turn ?? State.variables.turn ?? 0)>>
<</if>>
<</silently>>
''<div class="hub-textbox">
Some time later, after the camp has stopped shaking from the day’s work— after the blood is washed from hands, after the new goods are counted, after the crying is forced into quiet—
Kael finds you.
He approaches the fire like a man who does not fear the dark, only what it hides.
“So,” he says. “It’s taken care of.”
<<if _gainedPops>>
He lets his eyes move across the edge of the camp— the new arrivals huddled near the outer fires, close enough to feel warmth, far enough to be watched.
“They’ll need settling,” Kael says. “I’ll see it done.”
He pauses, studying the men among them: shoulders narrow, arms stringy, faces drawn tight by hunger.
“Weak,” he judges—then softens it, just a fraction. “But that’s starvation speaking. I see a few with hunter’s eyes. If they live through the first nights, they’ll learn.”
A beat.
“And if they don’t…” His shrug is small, and final.
<<else>>
His gaze goes to the piles instead— bundles of hide, chipped stone, salvaged cord, whatever wasn’t too broken to carry.
“Hm,” Kael grunts. “I’ll have that sorted.”
He crouches, lifts a tool, turns it once in his palm.
“Good stone,” he admits. “Not fine. But honest.”
Then he sets it down with the care of a man who’s learned not to waste anything that might keep a child alive.
<</if>>
He looks back to you, expression hard again.
“You dealt with them, $user—” he says, “but they were only the first.”
His voice drops, not from fear, but from certainty.
“We should expect others. Sooner or later.”
He glances outward—past the ring of firelight, past the spear-points at the perimeter— into the dark where the land waits, patient as a trap.
“And we’ll need to deal with them,” Kael continues, “before they decide to deal with us.”
For a moment he’s the same old Kael: stone-faced, practical, made of duty.
Then something cracks.
A small smile—brief as a spark—touches his mouth.
“Luckily,” he says, “the strongest chieftain—blessed by the spirits—stands with us.”
His eyes stay on yours.
“So our victory is already all but assured.”
<<silently>>
/* Start the next arc/quest via your widget */
<<startVictory_DominateRegion>>
<</silently>>
<div class="result-list">
<div class="result-line good">
<span class="label">Task accepted</span>
<span class="value">A new home</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<goto "Hub_1">>
<</button>>
</div><<silently>><<set _qid = "q_tutorial_migration_01">>
/* Choice comes from previous passage */
<<set _choice = $tutorialOutcome ?? "deal">>
/* Default: no check (deal always succeeds) */
<<set _doCheck = (_choice is "attack" or _choice is "absorb")>>
/* Easy DC – tutorial forgiving */
<<set _baseDC = 10>>
<<if _choice is "attack">>
<<set _baseDC = 9>>
<<elseif _choice is "absorb">>
<<set _baseDC = 9>>
<</if>>
/* Pick stat key only for checked choices */
<<set _statKey = (_choice is "attack") ? "strength" : "charisma">>
/* Roll only if needed */
<<set _roll = 0>>
<<set _stat = 0>>
<<set _total = 0>>
<<set _ok = true>>
<<if _doCheck>>
<<set _roll = random(1,20)>>
<<set _stat = Number(State.variables[_statKey] ?? 0)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _baseDC)>>
<</if>>
/* Record */
<<set $questLastCheck = {
ok:_ok,
statKey: _doCheck ? _statKey : "none",
stat:_stat,
roll:_roll,
dc:_baseDC,
total:_total,
choice:_choice
}>>
/* find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and ($quests[_i].id is _qid)>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
/* complete quest (always completes; outcome may be clean or messy) */
<<if _qIndex >= 0>>
<<set $quests[_qIndex].status = "complete">>
<<set $quests[_qIndex].markerRevealed = false>>
<</if>><</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if _doCheck>>
<<if $questLastCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print $questLastCheck.statKey>> + d20 vs DC</span>
<span class="value"><<print $questLastCheck.total>> / <<print $questLastCheck.dc>></span>
</div>
<<else>>
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Resolved</span>
</div>
<</if>>
</div>
<<if _choice is "deal">>
You raise a hand—slow.
Not mercy. Not weakness. Just a decision made without hurry.
“Then pay,” you say.
Their front-man swallows. He looks back once—counting ribs, counting eyes— then nods like a man stepping off a ledge.
They bring forward what little pride can carry: chipped stone blades wrapped in hide, a bundle of sinew cord, tools worn smooth by hands that no longer have fat to spare.
Your hunters take it without ceremony.
Food stays where it is.
Relief runs through their people in small, ugly ways— knees unbuckling, a woman pressing her face to a child’s hair as if to make sure it’s still there.
They retreat in the only safe way a cornered animal knows: backwards, eyes locked, spears never fully lowering.
<<silently>>
/* DEAL REWARDS: nice amount of goods/resources */
<<set _dFood = 0>>
<<set _dRes = 10>>
<<set _dGoods = 3>>
<<set _dPops = 0>>
<<set _dZeal = 0>>
<<set _dStab = 0>>
<<set $food = Number($food ?? 0) + _dFood>>
<<set $resources = Number($resources ?? 0) + _dRes>>
<<set $goods = Number($goods ?? 0) + _dGoods>>
<</silently>>
When you turn toward your camp again, the air feels lighter— not safe, not peaceful— but <i>settled</i>.
Your people walk with full hands and quiet mouths. The strangers do not follow. They do not chase. They simply vanish into whatever direction still hasn’t been poisoned by the Unmoving.
<div class="result-list">
<div class="result-line good">
<span class="label">Gained</span>
<span class="value">+<<print _dRes>> Resources, +<<print _dGoods>> Goods</span>
</div>
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
<<elseif $questLastCheck.ok>>
The moment stretches— then breaks.
<<if _choice is "attack">>
You do not shout.
You just point—two fingers, a short cut through the air.
Your hunters move like they’ve been starving for permission.
The strangers try to brace, try to hold their line— but fear makes them stiff, and stiff men die fast.
Spearheads find throats. Stone cuts open bellies. One of theirs turns to run and is dragged down by his own shadow.
Their people behind them scream, then choke it back, because noise doesn’t stop death—noise only tells it where to look.
It ends quick.
The survivors don’t “surrender.” They fold. They drop. They offer up hands like broken tools.
<<silently>>
/* ATTACK SUCCESS: gain food/resources/goods and a few pops (3–4) */
<<set _dFood = 16>>
<<set _dRes = 8>>
<<set _dGoods = 3>>
<<set _dPops = 3>>
<<set _dZeal = 0>>
<<set _dStab = 0>>
<<set $food = Number($food ?? 0) + _dFood>>
<<set $resources = Number($resources ?? 0) + _dRes>>
<<set $goods = Number($goods ?? 0) + _dGoods>>
<<set $pops = Math.max(0, Number($pops ?? 0) + _dPops)>>
<</silently>>
You take what they carried. You take what they ate. And you take the ones who still have breath to work.
The walk back is heavier— packs full, hands stained, new faces herded between spearpoints.
<<else>> <!-- absorb -->
You step closer—close enough they can smell you.
You speak of your camp. Of fire that doesn’t go out. Of hunting in numbers. Of rules that keep knives from turning inward when the nights get lean.
You do not offer comfort. You offer a place in the line.
Their front-man’s jaw works. Pride tries to stand up in him— then hunger crushes it again.
One spear lowers. Then another.
A woman steps out with a child pressed to her hip, eyes hollow, brave only because there’s nothing left to lose.
“Say it,” you tell them. “Not with words. With feet.”
And they move.
<<silently>>
/* ABSORB SUCCESS: get all pops (6–7), all food/resources/goods */
<<set _dFood = 20>>
<<set _dRes = 10>>
<<set _dGoods = 4>>
<<set _dPops = 7>>
<<set _dZeal = 0>>
<<set _dStab = 0>>
<<set $food = Number($food ?? 0) + _dFood>>
<<set $resources = Number($resources ?? 0) + _dRes>>
<<set $goods = Number($goods ?? 0) + _dGoods>>
<<set $pops = Math.max(0, Number($pops ?? 0) + _dPops)>>
<</silently>>
You take their bundles, their tools, their last dried meat— not as spoil, but as weight added to the same back.
They follow you toward camp in a tight knot, flinching at every birdcall, and your hunters—your people—walk around them like a living wall.
<</if>>
The matter is settled.
By the time your campfire smoke finds your nose again, you can feel the tribe’s shape change— a little larger, a little meaner, a little more certain that the world can be made to bend.
<div class="result-list">
<div class="result-line good">
<span class="label">Gained</span>
<span class="value">
<<if _choice is "attack">>
+<<print _dFood>> Food, +<<print _dRes>> Resources, +<<print _dGoods>> Goods, +<<print _dPops>> Pops
<<else>>
+<<print _dFood>> Food, +<<print _dRes>> Resources, +<<print _dGoods>> Goods, +<<print _dPops>> Pops
<</if>>
</span>
</div>
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
<<else>>
You misjudge the moment.
Not badly— but enough.
Breath catches. Weight shifts. The wrong eyes meet at the wrong time.
<<if _choice is "attack">>
You give the sign— and your hunters surge— then hesitate half a breath too late.
The strangers don’t break cleanly. They don’t die cleanly either.
One of yours takes a point through the forearm. Another catches a rock to the cheek and keeps fighting with blood in his teeth.
It becomes a scramble on bad ground. A thing of slipping feet and short-range stabbing.
You win, because you have to— but the victory is costlier than it should be.
<<silently>>
/* ATTACK FAIL: still gain food/resources/goods, but lose 2–3 pops */
<<set _dFood = 12>>
<<set _dRes = 6>>
<<set _dGoods = 2>>
<<set _dPops = -2>>
<<set _dZeal = 0>>
<<set _dStab = 0>>
<<set $food = Number($food ?? 0) + _dFood>>
<<set $resources = Number($resources ?? 0) + _dRes>>
<<set $goods = Number($goods ?? 0) + _dGoods>>
<<set $pops = Math.max(0, Number($pops ?? 0) + _dPops)>>
<</silently>>
You take what you can carry.
But you carry bodies too.
On the walk back, nobody talks much. Its all quite a quiet affair.
<<else>> <!-- absorb -->
Your words land— then slide off.
You offer the line. They see the teeth behind it.
Their front-man’s eyes never leave your hands. He’s listening, but he’s counting exits.
A child coughs behind him. A woman pulls the child closer as if you might snatch the breath straight out of its mouth.
They don’t strike. They don’t join.
They just… withdraw— step by step, refusing to turn their backs, refusing to step into your shadow.
And your hunters watch them go with a slow, sour anger.
<<silently>>
/* ABSORB FAIL: still gain all food/resources/goods, but lose medium zeal/stability */
<<set _dFood = 20>>
<<set _dRes = 10>>
<<set _dGoods = 4>>
<<set _dPops = 0>>
<<set _dZeal = -4>>
<<set _dStab = -4>>
<<set $food = Number($food ?? 0) + _dFood>>
<<set $resources = Number($resources ?? 0) + _dRes>>
<<set $goods = Number($goods ?? 0) + _dGoods>>
<<set $zeal = Number($zeal ?? 0) + _dZeal>>
<<set $stability = Number($stability ?? 0) + _dStab>>
<</silently>>
You still claim their scattered burdens— the abandoned bundles, the dropped tools, the food they can’t carry fast enough.
But you feel it in your camp-bound steps:
Some of your people wanted a miracle. Some wanted a clean triumph. What they got was neither— just more mouths you didn’t gain, and more questions you didn’t answer.
<</if>>
The situation resolves itself later— without your hand guiding it.
By the time your fires come into view, the tribe is already chewing on the story, shaping it into something sharp enough to cut each other with.
<div class="result-list">
<div class="result-line good">
<span class="label">Gained</span>
<span class="value">
+<<print _dFood>> Food, +<<print _dRes>> Resources, +<<print _dGoods>> Goods
<<if _dPops>>
, <<print (_dPops > 0 ? "+" : "")>><<print _dPops>> Pops
<</if>>
</span>
</div>
<<if _choice is "attack">>
<div class="result-line bad">
<span class="label">Lost</span>
<span class="value"><<print -_dPops>> Pops</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Strain</span>
<span class="value"><<print _dZeal>> Zeal, <<print _dStab>> Stability</span>
</div>
<</if>>
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Return to camp</span>" "Quest_Tutorial_End">><</link>>
</div><<silently>>
<<set _tribeId = "npc_camp_1">>
<<set _tribeName = (setup.tribes && setup.tribes.getById)
? (setup.tribes.getById(_tribeId)?.name ?? "Unknown Tribe")
: "Unknown Tribe">>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<</silently>>
<div id="wildling-wrap">
''<div class="hub-textbox story-scroll-has-inline-actions">
Some time after the encounter—on a rare stretch of hours where nothing immediately demands your hand—you decide to search for the wild woman again.
It should be simple.
It isn’t.
A full day passes with nothing but false leads and your own irritation. Then another. Then another. She’s an elusive thing—light on the ground, careful, leaving almost nothing behind. No clear tracks. No campfire smoke. No scraps. Nothing to chase except instinct… and the faint memory of her eyes.
By the fifth day, even you begin to feel the edge of doubt. You’re already turning back, already deciding it’s a waste—
When your hearing catches something in the distance.
A scream.
But not a woman’s.
“Gaaah! You bitch!”
You move toward it without thinking, silent through the brush.
The scene you find isn’t a hunt. It’s an extraction.
One hunter clutches his hand, red dripping between his fingers—one finger missing at the knuckle. His face is twisted in rage and pain. On the ground a few steps away, pinned under a knee, is the same wild woman.
She’s fighting like an animal—twisting, snapping, spitting. Even restrained, she looks dangerous in a way that has nothing to do with weapons.
The man holding her down yanks her hair back and cracks a backhand across her face.
The sound is dull. Practiced.
Something small and pale tumbles from her mouth and lands in the dirt.
A bitten-off finger.
He leans close, voice low and contemptuous, the kind of tone men use when they think no consequence exists.
“You hunt on the <<print _tribeName>> territory, woman. You either pay tribute… or join the tribe, if you want to take what’s ours.”
The wild woman snarls—an ugly, feral sound. She doesn’t understand a lick of his words.
But even if she did, her answer is clear enough.
The bleeding hunter forces a grin, trying to look amused through the pain. It doesn’t quite work.
“Can’t even talk,” he spits. “Fine. We’ll get paid our due, one way or another.”
A cruel world produces cruel routines—and men like these learn quickly what they can do when no one is watching.
Except…
Someone is watching.
Behind them, half-hidden by shadow and leaves, you stand quietly with the weight of a dead boar’s strength still in your bones, observing the scene as it unfolds—unnoticed, for now.
The question isn’t what’s happening.
The question is what you do next.
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Intervene</span>">>
<<set $q_wildling_choice = "intervene">>
<<goto "Quest_Wildling_01_Resolve">>
<</button>>
<<button "<span class='choice-text'>Keep watching for a moment</span>">>
<<set $q_wildling_choice = "watch">>
<<replace "#wildling-wrap">>
<<silently>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags.q_wildling_01_watched = true>>
<</silently>>
''<div class="hub-textbox story-scroll-has-inline-actions">
You decide to remain a silent observer, sinking deeper into the foliage to let the cruel drama unfold. The shadows swallow your figure, masking the heavy judgment in your eyes.
The men waste no more words.
The injured hunter, eyes wild with pain and malice, grabs the tattered rags at her waist and tears them away.
The fabric gives with a wet rip, leaving her bare to the cooling air. She doesn't cover herself; she uses the little ffreedom of movement she has to strike, lashing out with a heel that catches the uninjured man in the thigh. He snarls, a thick hand rising to backhand her again, the crack of bone on bone splitting the air and dazing her just long enough for them to manhandle her.
They force her onto her hands and knees, a chaotic knot of limbs and aggression. The first hunter spits into his palm and shoves his fingers into her cunt, spreading her roughly. She howls, bucking her hips with enough force to nearly unseat him, her body thrashing like a trapped wolf caught in a snare.
He grips her hips hard enough to bruise and lines himself up, and with one brutal thrust, he buries himself to the hilt. She doesn't weep. She throws her head back and screams, a sound of pure, unadulterated fury.
Her nails dig into the dirt, tearing up clumps of grass as she tries to crawl away, dragging him with her. The second man moves behind his partner, forcing her ass cheeks apart. He spits on her tight rear hole, and when he presses forward, she goes rigid, sensing the double invasion coming. She kicks backward, catching the first man in the shin, but they outnumber her and outweigh her.
The second man forces his way into her ass, and she arches her spine, a high-pitched shriek tearing through the clearing.
<<nsfwimg "images/expeditions/WildlingQuest/Watch.webp">>
She is sandwiched between them, filled in both holes, but even impaled, she doesn't go limp. She fights like a wildcat, clamping her muscles down in a crushing rejection that only makes the men work harder to breach her resistance. She claws at the arms holding her, she spits blood, and she twists violently, turning the rape into a vicious, sweating struggle.
You’ve seen enough.
There are only two real endings from here.
You decide which one happens.
<div class="hub-buttons story-scroll-actions-inline">
<<button "<span class='choice-text'>Intervene</span>">>
<<set $q_wildling_choice = "intervene">>
<<goto "Quest_Wildling_01_Resolve">>
<</button>>
<<button "<span class='choice-text'>Let it happen and leave</span>">>
<<set $q_wildling_choice = "leave">>
<<goto "Quest_Wildling_01_Resolve">>
<</button>>
</div>
</div>''
<<run (function () {
function goTop() {
try { $("#passages").scrollTop(0); } catch (e) {}
try { $("#content-wrapper").scrollTop(0); } catch (e) {}
try { $(".hub-textbox").scrollTop(0); } catch (e) {}
try { $(".passage:visible").scrollTop(0); } catch (e) {}
try { window.scrollTo(0, 0); } catch (e) {}
}
goTop();
try { requestAnimationFrame(goTop); } catch (e) {}
setTimeout(goTop, 0);
})();>>
<</replace>>
<</button>>
<<button "<span class='choice-text'>Let it happen and leave</span>">>
<<set $q_wildling_choice = "leave">>
<<goto "Quest_Wildling_01_Resolve">>
<</button>>
</div>
</div>''
</div><<silently>>
/* ===========================
RESOLVE QUEST: The Wildling (always completes) =========================== */
<<set _qid = "q_wildling_01">>
<<set _choice = String($q_wildling_choice ?? "")>>
/* store choice (optional) */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if _choice>>
<<set $questFlags["q_wildling_01_choice"] = _choice>>
<</if>>
/* find quest object */
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
/* mark complete + hide marker */
<<if _qIndex >= 0>>
<<set $quests[_qIndex].status = "complete">>
<<set $quests[_qIndex].markerRevealed = false>>
<</if>>
<<set $questFlags[_qid + "_done"] = true>>
<<set $q_wildling_01_resolvedTurn = $turn>>
<<set $q_wildling_01_resolvedChoice = _choice>>
<<set $questFlags.q_wildling_01_saved = (_choice is "intervene")>>
<</silently>>
''<div class="hub-textbox">
<<if _choice is "intervene">>
You approach the men.
Your steps look slow—almost casual—yet the distance vanishes beneath you all the same. Like time can’t quite decide how fast you’re allowed to move.
By the time the man pinning her down realizes something is wrong, the only sound he manages is a confused—
“Hu—”
**CRACK**
His head turns the wrong way.
You don’t lunge. You don’t roar. You don’t even grimace. You simply *end him*—and then casually kick the collapsing body aside as if it’s a log in your path.
The second man’s full attention snaps to you. He starts to rise, sputtering as panic and indignation collide.
“Wh—What the fuck do you think you are doin—”
But that was his mistake.
The wild woman is already moving.
The instant the weight is off her, she surges forward on all fours, faster than seems possible—hair whipping, nails scraping earth. She doesn’t reach for a weapon. She doesn’t even bother to stand properly.
She *launches*.
Her hands hook him just long enough to drag him down—and then her mouth finds his throat.
Teeth sink in.
Not a clean bite. Not a quick kill.
A savage *clamp* that tears and worries like a beast feeding, jaw working side to side as he spasms beneath her. Blood gushes hot and bright, spraying her chin and lips. His scream dies into a wet gargle, fingers clawing uselessly at her shoulders as she shakes her head once, hard, like a wolf snapping a bone.
He collapses, choking, eyes wide and emptying.
And still she isn’t done.
She snatches up a rock and brings it down—once, twice—then again, and again, not to kill him but to *erase him*. To make certain. To make sure the world understands.
<<if $questFlags and $questFlags.q_wildling_01_watched>>
…Or that’s what you think, at first.
The blows continue long after life has left him. Long after the body stops twitching. Long after the face becomes something unrecognizable.
A brutality without hesitation—one that feels less like victory and more like years of terror finally finding somewhere to go.
And you can’t help the thought that it was, at least indirectly, your fault.
That your earlier inaction helped carve this into her.
<</if>>
When she finally stops, she rises slowly—heaving, shoulders trembling.
Blood shines wet around her mouth—smeared across her lips and teeth, streaked down her chin as she pants. She doesn’t bother to cover herself. Modesty is for people who feel safe.
She stares at you, trying to summon a guard that her exhausted body can no longer hold. Whatever feral pride she has left flickers… then fades beneath sheer fatigue.
You don’t speak.
You don’t need to.
Instead, you extend your hand and wait.
For a long moment she just watches it, eyes narrowing—calculating, weighing choices. Fight. Flee. Bite. Run.
But tiredness wins out.
She takes one careful step toward you.
Then another.
Finally, she places her hand in yours.
Her grip is weak—but it’s a decision.
And almost immediately, her legs betray her. She sways, knees buckling, and you catch her before she hits the ground.
You look down at her face.
Her eyes have already rolled half-shut.
She’s passed out.
It seems you’ll have to carry her, you conclude silently, as you hoist her over your shoulder and turn back toward camp—leaving two bodies behind in the dirt and a new problem resting against your back.
<<silently>>
/* Love gain:
- normal: +20 - if "watched" flag was activated earlier: +10
*/
<<run (function () {
const V = SugarCube.State.variables;
const watched = !!(V.questFlags && (V.questFlags.q_wildling_01_watched || V.questFlags["q_wildling_01_watched"]));
const gain = watched ? 10 : 20;
/* store for later application when she actually joins camp */
V.q_wildling_savedLoveGain = gain;
V.q_wildling_loveGain = gain;
})();>>
/* ===========================
NPC Tribe 1 loses 2 population (real effect) =========================== */
<<set _tribeId = "npc_camp_1">>
<<set _t = (setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tribeId) : null>>
<<set _tribeName = (_t && _t.name) ? _t.name : "NPC Tribe 1">>
<<set _popLoss = 2>>
<<set _enemyPops = Math.max(0, Number(_t?.stats?.population ?? 0))>>
<<set _actualLoss = Math.min(_enemyPops, _popLoss)>>
<<if _t>>
<<set _t.stats.population = Math.max(0, _enemyPops - _actualLoss)>>
<<run if (setup.tribes && setup.tribes.recalcDerived) setup.tribes.recalcDerived(_t);>>
<</if>>
<</silently>>
<div class="result-list">
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
<div class="result-line good">
<span class="label">Love gained</span>
<span class="value">+<<print $q_wildling_loveGain>></span>
</div>
<div class="result-line bad">
<span class="label"><<print _tribeName>> population</span>
<span class="value">-<<print _actualLoss>></span>
</div>
</div>
<<elseif _choice is "leave">>
You do nothing.
Whether it’s because you decide this is the fate she earned… or due to simple indifference—your feet remain planted and your hands remain still.
The world they live in has taught them that strength is permission, and that a lone, feral woman is a thing to be claimed, paid for, or broken until it stops fighting.
The wild woman thrashes once more, teeth bared, eyes blazing with the kind of defiance that doesn’t survive long in a world like this.
Another slap.
A hard pull.
A curse.
Then they drag her deeper into the trees, and the forest swallows the sounds one by one until even the last struggle fades into silence.
You return to camp with meat on your shoulder and no story worth telling.
And in the days that follow, you don’t hear her again.
No distant hiss.
No sudden snap of cord.
No eyes watching from the brush.
Whatever was her fate, you doubt you’ll be seeing her again.
<div class="result-list">
<div class="result-line good">
<span class="label">Task</span>
<span class="value">Completed</span>
</div>
</div>
<<else>>
Something feels off—your choice didn’t take.
<div class="result-list">
<div class="result-line bad">
<span class="label">Task</span>
<span class="value">Error</span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<if $questFlags and $questFlags.q_wildling_lake_root_taken>><<goto "Hub_1">><</if>>
<<set $energy = Math.max(0, Number($energy ?? 0) - 1)>>
<<run setup.wildHeart.createLakeQuest()>>
<<set _dc = 5>>
<<set _roll = random(1, 20)>>
<<set _stat = Number(State.variables.wisdom ?? 0)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _dc)>>
<<set _granted = false>>
<<set $questLastCheck = {
ok:_ok,
statKey:"wisdom",
stat:_stat,
dc:_dc,
roll:_roll,
total:_total
}>>
<<if _ok>>
<<set _granted = (setup.wildHeart.grantRootCluster() ? true : false)>>
<<run setup.wildHeart.setLakeCraftObjective()>>
<</if>>
<</silently>>
''<div class="hub-textbox">
-1 Energy
After having your men scout the lakeshore for several days, you finally find a stretch of bank that might hold what you need. Even so, your hunters have trouble spotting it on their own, so in the end you join the search yourself.
<div class="result-list">
<<if $questLastCheck.ok>>
<div class="result-line good">
<span class="label">Wisdom check</span>
<span class="value">PASSED</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Wisdom check</span>
<span class="value">FAILED</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom + d20 vs DC</span>
<span class="value"><<print $questLastCheck.total>> / <<print $questLastCheck.dc>></span>
</div>
<div class="result-line">
<span class="label">Check total</span>
<span class="value"><<print $questLastCheck.total>> (<<print $questLastCheck.stat>> + <<print $questLastCheck.roll>>)</span>
</div>
<div class="result-line bad">
<span class="label">Energy</span>
<span class="value">-1</span>
</div>
<<if _granted>>
<div class="result-line good">
<span class="label">Quest item</span>
<span class="value">Root Cluster</span>
</div>
<div class="result-line good">
<span class="label">Quest updated</span>
<span class="value">Craft the poultice</span>
</div>
<</if>>
</div>
<<if $questLastCheck.ok>>
At last, after a long search, something catches your eye.
It is hidden among the reeds and low growth, plain enough that you might have overlooked it a dozen times already. At first glance it seems no different from the other plants around it, but Morag had been clear: this was the one.
And now, finally, you have it.
All that remains is to return to camp and have the poultice prepared.
<<else>>
But despite your best efforts, and the time spent searching day after day, you still come up empty-handed. All you are left with is wasted time and growing doubt.
Perhaps you were wrong. Perhaps the roots are not here after all.
You will need to try again.
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
<<set _kaelPresent = false>>
<<if $campNpcs and $campNpcs.length>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<if $campNpcs[_i] and $campNpcs[_i].id is "npc_kael">>
<<set _kaelPresent = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<</silently>>''<div class="hub-textbox">
You stand once more within sight of the hidden caves, the river and hanging growth doing their best to make the place seem less real than it is.
<<if _kaelPresent>>
Kael waits beside you with the same calm expression he wore before, though his eyes stay on the largest entrance.
“Well,” he says at last. “We know enough now. The only question is how you want to proceed.”
<</if>>
The men you brought wait farther back among the trees, ready if you mean to use them.
How will you deal with the cave tribe?
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Lead an attack with your hunters</span>">>
<<set $kaelCaveTribeApproach = "attack">>
<<goto "Quest_q_kael_cave_tribe_attack_01">>
<</button>>
<<button "<span class='choice-text'>Leave them</span>">>
<<set $kaelCaveTribeApproach = "leave">>
<<goto "Quest_q_kael_cave_tribe_leave">>
<</button>>
</div><<silently>><<run setup.playBattleSceneTrack ? setup.playBattleSceneTrack() : (setup.playBattle ? setup.playBattle() : null)>><</silently>>''<div class="hub-textbox">
You signal for the waiting hunters to close in.
Men move through the undergrowth at your command, quiet at first, each of them watching the dark cave mouth with the tense focus of someone who already expects blood.
Kael steps up beside you and gives a short nod.
“Then we do this properly,” he says. “Fast. Hard. Before they understand what is happening.”
You nod and look towards the caves
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>The attack begins</span>">>
<<goto "Quest_q_kael_cave_tribe_attack_02">>
<</button>>
</div>''<div class="hub-textbox">
You approach the cave with your men ready behind you, weapons in hand and nerves drawn tight.
<<silently>>
<<set _entryDc = 13>>
<<set _entryRoll = random(1, 20)>>
<<set _entryStat = Number($leadership ?? 0)>>
<<set _entryTotal = _entryStat + _entryRoll>>
<<set _entrySuccess = (_entryTotal >= _entryDc)>>
<<set $kaelCaveAttackEntryCheck = {
ok: _entrySuccess,
statKey: "Leadership",
stat: _entryStat,
roll: _entryRoll,
dc: _entryDc,
total: _entryTotal
}>>
<<set _entryLoss = 0>>
<<if not _entrySuccess>>
<<set _entryLoss = 2>>
<<set $pops = Math.max(0, Number($pops ?? 0) - _entryLoss)>>
<</if>>
<<set $kaelCaveAttackEntryLoss = _entryLoss>>
<</silently>>
<div class="result-list">
<<if $kaelCaveAttackEntryCheck.ok>>
<div class="result-line good">
<span class="label">Leadership check</span>
<span class="value">PASS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Leadership check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Leadership + d20 vs DC</span>
<span class="value"><<print $kaelCaveAttackEntryCheck.total>> / <<print $kaelCaveAttackEntryCheck.dc>></span>
</div>
<<if $kaelCaveAttackEntryLoss > 0>>
<div class="result-line bad">
<span class="label">Population lost</span>
<span class="value">-<<print $kaelCaveAttackEntryLoss>></span>
</div>
<</if>>
</div>
<<if $kaelCaveAttackEntryCheck.ok>>
It does not take long to notice that the caves are far quieter than they were the last time you were here.
You begin directing your men with simple hand signals, keeping your voice low and your movements sharp. One group moves toward the main entrance with you, while the others spread out in pairs toward the smaller side passages.
The silence does not last.
A clash rings out from somewhere deeper within the stone.
Then another.
For a moment, it seems as though some of the tribe mean to fall back into the side tunnels and circle around behind you, but your men are already there waiting. The would-be ambushers are caught before they can turn the caves against you.
You press forward.
<<else>>
It does not take long to notice that the caves are far quieter than they were the last time you were here.
You move your men forward, many and strong, but it quickly becomes clear that numbers alone mean little in a place like this. The darkness shifts around every step. Narrow passages twist into one another. Shapes move at the edge of sight, and for a few dangerous moments it becomes difficult to tell friend from foe.
Then comes the first strike.
The snap of a bowstring.
A spear thrust from the side.
Your senses are sharp enough to catch the ambushers quickly, and your men do answer with force—but not before blood is spilled. The cave tribe knows this ground better than you do, and in the opening moments of the assault, that knowledge costs you men.
Still, the attack does not falter.
You drive onward.
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Continue</span>">>
<<goto "Quest_q_kael_cave_tribe_attack_03">>
<</button>>
</div>''<div class="hub-textbox">
As you move deeper into the cave, it becomes clear that the danger here is not only the stone, the darkness, or the hidden traps.
Your men, for all their effort, seem to be losing focus.
Even with weapons in hand and tension in their limbs, their minds begin to drift, tugged elsewhere by the sounds, scents, and strange atmosphere of the place.
<<silently>>
<<set _deepDc = 15>>
<<set _deepRoll = random(1, 20)>>
<<set _deepStat = Number($leadership ?? 0)>>
<<set _deepTotal = _deepStat + _deepRoll>>
<<set _deepSuccess = (_deepTotal >= _deepDc)>>
<<set $kaelCaveAttackDeepCheck = {
ok: _deepSuccess,
statKey: "Leadership",
stat: _deepStat,
roll: _deepRoll,
dc: _deepDc,
total: _deepTotal
}>>
<<set _deepLoss = 0>>
<<if not _deepSuccess>>
<<set _deepLoss = 1>>
<<set $pops = Math.max(0, Number($pops ?? 0) - _deepLoss)>>
<</if>>
<<set $kaelCaveAttackDeepLoss = _deepLoss>>
<</silently>>
<div class="result-list">
<<if $kaelCaveAttackDeepCheck.ok>>
<div class="result-line good">
<span class="label">Leadership check</span>
<span class="value">PASS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Leadership check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Leadership + d20 vs DC</span>
<span class="value"><<print $kaelCaveAttackDeepCheck.total>> / <<print $kaelCaveAttackDeepCheck.dc>></span>
</div>
<<if $kaelCaveAttackDeepLoss > 0>>
<div class="result-line bad">
<span class="label">Population lost</span>
<span class="value">-<<print $kaelCaveAttackDeepLoss>></span>
</div>
<</if>>
</div>
<<if $kaelCaveAttackDeepCheck.ok>>
Yet you remain focused, and that is enough.
You keep your men moving with sharp gestures and hard looks, herding them through the tunnels like a wary shepherd guiding a flock through wolf-country. Again and again, you spot the signs of danger before your men stumble into them: a stretched cord, a loosened stone, a patch of ground too carefully disturbed.
Trap after trap is avoided.
It does not take long before you finally reach the great chamber ahead—the largest space in the cave, and almost certainly the place where the bulk of the tribe has gathered.
And so, with your men behind you, you enter.
<<else>>
Even you lose focus for a moment.
Your foot catches a trap hidden beneath the ground. It bites into you and draws blood before your flesh knits itself back together as you shake off the pain and keep moving.
Your men are not capable of the same.
With every stretch of cave you force your way through, another cry rings out—a yelp, a curse, a scream of pain as hidden traps claim flesh, balance, and blood. Then, at last, one of them claims more than that.
A hunter dies.
Still, you press on.
At length, you find yourself standing before the great chamber ahead, the largest room in the cave, and almost certainly the place where the bulk of the tribe has gathered.
And so, with your battered men behind you, you enter.
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Enter</span>">>
<<goto "Quest_q_kael_cave_tribe_attack_04">>
<</button>>
</div>''<div class="hub-textbox">
You find yourself standing before the tribe at last.
There are perhaps fifty of them—mostly women, though some men are scattered among them as well. At their center stands their leader, the same woman you saw before. She faces you boldly, seemingly untroubled by the armed men at your back.
“So,” she says, her voice calm, almost amused, “it was your people causing all that noise?”
Her eyes move over you, then briefly over the hunters behind you.
“If you had announced yourselves, we might even have welcomed you. Instead, you come crashing into our home with spears in hand.”
A faint smile touches her lips.
“Why is that, stranger?”
Your reasons, whatever they may truly be, are yours alone.
But one thing remains clear enough.
They are keeping something that does not belong to them.
You lift a hand and point toward the two men lying sprawled deeper in the chamber—thinner than they should be, still slack and unmoving, seemingly unable to wake even during the chaos of your assault.
The woman’s gaze follows your gesture.
“Ah,” she says. “Those two. So that is what this is about.”
She gives a small shrug.
“You could have simply asked for them. It is not as though we keep them in chains. They stayed of their own accord.”
Her eyes flick briefly toward the scouts before returning to you.
“We were merely being... accommodating.”
<<if $kaelScoutsWisdomPassed or $kaelScoutsGhostwalkSeen>>
You do not let the half-truth pass unchallenged.
You point out that words like ''could leave'' mean very little in the state those men are in. Whatever they have been drinking, whatever has been poured into them, choice is hardly part of it any longer.
One of her eyebrows lifts slightly, and for the first time she seems genuinely surprised.
Then she smiles.
“Did you visit us before, unknown face?” she asks. “I would find it very strange if I had somehow forgotten a handsome man like you.”
<</if>>
At last, she lets out a slow breath.
“Very well,” she says. “If you want them back, take them.”
Her tone remains maddeningly composed.
“Or is that not enough? Do you want compensation for your troubles? Or will only blood satisfy this insult?”
She spreads her hands lightly at her sides, as though indulging you.
“Well?”
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Take your men and leave</span>">>
<<set $kaelCaveTribeDemand = "take_men">>
<<goto "Quest_q_kael_cave_tribe_attack_05">>
<</button>>
<<button "<span class='choice-text'>Demand blood</span>">>
<<set $kaelCaveTribeDemand = "blood">>
<<goto "Quest_q_kael_cave_tribe_attack_05">>
<</button>>
<<if $kaelScoutsWisdomPassed or $kaelScoutsGhostwalkSeen>>
<<button "<span class='choice-text'>Demand compensation</span>">>
<<set $kaelCaveTribeDemand = "compensation">>
<<goto "Quest_q_kael_cave_tribe_attack_05">>
<</button>>
<</if>>
</div>''<div class="hub-textbox">
<<if $kaelCaveTribeDemand is "blood">>
<<silently>>
<<set _bloodDc = 13>>
<<set _bloodRoll = random(1, 20)>>
<<set _bloodStat = Number($endurance ?? 0)>>
<<set _bloodTotal = _bloodStat + _bloodRoll>>
<<set _bloodSuccess = (_bloodTotal >= _bloodDc)>>
<<set $kaelCaveTribeBloodCheck = {
ok: _bloodSuccess,
statKey: "Endurance",
stat: _bloodStat,
roll: _bloodRoll,
dc: _bloodDc,
total: _bloodTotal
}>>
<<run setup.tribes.resolveMachiCaveOutcome({ mode: "blood", popGain: 20, sapQty: 3, destroyTribe: true })>>
<</silently>>
You do not bother answering with words.
You simply raise your hand...
...and bring it down.
Your men know what it means, and they do not hesitate.
They surge forward at once.
There is resistance, of course, but with you there, it is negligible. Some of the tribe try to flee. Others try to fight. Neither ends well for them.
One of those who resists is the woman herself.
Aífe.
With surprising speed, she slips past one of your men and lunges straight for you. You do not see where she draws it from, but suddenly a stone knife, far sharper than such a thing has any right to be, flashes in her hand and drives for your neck.
<div class="result-list">
<<if $kaelCaveTribeBloodCheck.ok>>
<div class="result-line good">
<span class="label">Endurance check</span>
<span class="value">PASS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Endurance check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Endurance + d20 vs DC</span>
<span class="value"><<print $kaelCaveTribeBloodCheck.total>> / <<print $kaelCaveTribeBloodCheck.dc>></span>
</div>
</div>
<<if $kaelCaveTribeBloodCheck.ok>>
Yet it does not pierce.
It cannot.
The blade presses against your flesh and stops there, refusing to go any farther.
For a single moment, your eyes meet hers.
<<else>>
The knife lands.
It bites into your neck, not deep enough to kill outright, but more than enough to at the very least cripple any normal man. Pain flares through you, sharp and immediate, forcing your head to tilt with the impact.
It hurts.
But it is not enough.
You straighten again, fix your gaze on her, then calmly seize her wrist and force the blade back out. Even as her eyes remain locked on yours, the wound is already beginning to close before her.
<<set $endurance = Math.max(0, Number($endurance || 0) - 1)>>
<</if>>
Something flashes in her eyes for a moment.
Surprise, perhaps.
Then acceptance.
Perhaps even the faintest trace of amusement.
And then one of your men drives a spear through her.
She falls.
As the light leaves her eyes, she keeps looking at you, through you, almost. Even at the end, you do not think you saw fear there.
At last, you turn your attention to what remains.
The living. The dying. The dead.
You give another signal, and your men begin rounding up the survivors while the two lost scouts are dragged free from the chamber. Then, without ceremony, you begin the march back to camp.
Your task is complete.
<div class="result-list">
<div class="result-line good">
<span class="label">Population gained</span>
<span class="value">+20</span>
</div>
<div class="result-line good">
<span class="label">Item gained</span>
<span class="value">+3 Machi Sap</span>
</div>
<div class="result-line neutral">
<span class="label">Outcome</span>
<span class="value">Machi Tribe destroyed</span>
</div>
</div>
<</if>>
<<if $kaelCaveTribeDemand is "take_men">>
<<run setup.tribes.resolveMachiCaveOutcome({ mode: "take_men", popGain: 2, sapQty: 1, unlockTribe: true, relations: 12 })>>
You look at her for a moment, then take a slow breath before answering.
“You will return my men,” you say. “And you will not do something like this again.”
For a brief moment, the woman simply studies you.
Then she smiles, clearly pleased with your answer.
“Of course, strange face,” she says. “But to let you leave with nothing at all would be rude. After all... you worked so hard.”
She turns her head slightly.
“Girls.”
At once, two of the tribe’s women hurry off toward a smaller side chamber. A moment later, they return carrying a wide bowl filled with a thick purple mixture, its scent strong enough to reach you even from a short distance away.
“Please,” she says, gesturing lightly toward it, “take this as a sign that bygones should remain bygones.”
Her smile deepens just a little.
“And if you happen to like it... we would always be willing to trade more. Send someone for it, and perhaps an arrangement could be made.”
Then, after the briefest pause, she adds:
“Though I would prefer it if you came to do the negotiating yourself, strange face.”
She gives you a small wink.
You take the bowl and hand it off to one of your men to carry with care, while the others move to retrieve the missing scouts.
As you turn to leave, her voice follows after you—calm as ever.
“Be sure to visit again soon.”
<div class="result-list">
<div class="result-line good">
<span class="label">Population gained</span>
<span class="value">+2</span>
</div>
<div class="result-line good">
<span class="label">Item gained</span>
<span class="value">+1 Machi Sap</span>
</div>
<div class="result-line good">
<span class="label">New faction unlocked</span>
<span class="value">Machi Tribe</span>
</div>
</div>
<</if>>
<<if $kaelCaveTribeDemand is "compensation">>
<<silently>>
<<set _compDc = 13>>
<<set _compRoll = random(1, 20)>>
<<set _compStat = Number($stewardship ?? 0)>>
<<set _compTotal = _compStat + _compRoll>>
<<set _compSuccess = (_compTotal >= _compDc)>>
<<set _compTribute = _compSuccess ? 2 : 1>>
<<set $kaelCaveTribeCompCheck = {
ok: _compSuccess,
statKey: "Stewardship",
stat: _compStat,
roll: _compRoll,
dc: _compDc,
total: _compTotal
}>>
<<run setup.tribes.resolveMachiCaveOutcome({ mode: "compensation", popGain: 2, sapQty: _compTribute, unlockTribe: true, relations: -18, tributeQty: _compTribute })>>
<</silently>>
You lay it out simply.
They took something that was yours, and in turn, you will take something that is theirs.
They will pay tribute—regularly—granting you a steady supply of the drink they fed to your men.
Aífe watches you in silence for a long moment before letting out a slow, measured sigh.
“Very well,” she says. “It is not as though we have much room to negotiate.”
Her tone remains calm, though less amused than before.
“You may send someone to collect the sap every 15 moons. It is difficult to make, and we still require some for ourselves.”
<div class="result-list">
<<if $kaelCaveTribeCompCheck.ok>>
<div class="result-line good">
<span class="label">Stewardship check</span>
<span class="value">PASS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Stewardship check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Stewardship + d20 vs DC</span>
<span class="value"><<print $kaelCaveTribeCompCheck.total>> / <<print $kaelCaveTribeCompCheck.dc>></span>
</div>
</div>
<<if $kaelCaveTribeCompCheck.ok>>
You do not answer immediately.
Instead, you raise your hand and hold up two fingers.
For the first time, real irritation touches her face.
“I already told you,” she says, “we cannot spare more than one. If we give away too much—”
You interrupt her by striking your foot sharply against the stone, then slowly begin to raise a third finger.
She stares at you for a moment, then exhales through her nose in visible frustration.
“Fine,” she says. “Fine. You will have two.”
Her eyes narrow.
“Will that be all, or do you want the skin off our backs as well?”
You do not bother replying. Instead, you gesture for your men to collect what is owed, retrieve the scouts, and prepare to leave.
<div class="result-list">
<div class="result-line good">
<span class="label">Population gained</span>
<span class="value">+2</span>
</div>
<div class="result-line good">
<span class="label">Item gained</span>
<span class="value">+2 Machi Sap</span>
</div>
<div class="result-line good">
<span class="label">Tribute secured</span>
<span class="value">2 Machi Sap every 15 turns</span>
</div>
<div class="result-line neutral">
<span class="label">New faction unlocked</span>
<span class="value">Machi Tribe</span>
</div>
<div class="result-line bad">
<span class="label">Relations worsened</span>
<span class="value">They will remember the coercion</span>
</div>
</div>
<<else>>
You hold her gaze, but do not press further.
Better a steady tribute than forcing the matter until it breaks.
Aífe seems to sense the decision at once.
“Good,” she says. “Then we understand one another.”
You have your men collect what has been offered, retrieve the missing scouts, and prepare to leave.
<div class="result-list">
<div class="result-line good">
<span class="label">Population gained</span>
<span class="value">+2</span>
</div>
<div class="result-line good">
<span class="label">Item gained</span>
<span class="value">+1 Machi Sap</span>
</div>
<div class="result-line good">
<span class="label">Tribute secured</span>
<span class="value">1 Machi Sap every 15 turns</span>
</div>
<div class="result-line neutral">
<span class="label">New faction unlocked</span>
<span class="value">Machi Tribe</span>
</div>
<div class="result-line bad">
<span class="label">Relations worsened</span>
<span class="value">They yield, but grudgingly</span>
</div>
</div>
<</if>>
<</if>>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<run setup.stopBattleSceneTrack ? setup.stopBattleSceneTrack() : null>>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<run setup.tribes.resolveMachiCaveOutcome({ mode: "leave" })>>
<</silently>>''<div class="hub-textbox">
You stand there for a moment longer, listening to the muffled life inside the caves and the uneasy breathing of the hunters waiting behind you.
Whatever took the missing scouts, it is still in there. So is the tribe that sheltered them.
But today, you choose not to force the matter.
The order goes out quietly. Your hunters pull back into the trees, and the hidden caves are left undisturbed.
<div class="result-list">
<div class="result-line bad">
<span class="label">Quest failed</span>
<span class="value">You left the cave tribe alone</span>
</div>
<div class="result-line bad">
<span class="label">Scouts abandoned</span>
<span class="value">The missing scouts were not recovered</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "<span class='choice-text'>Return to camp</span>">>
<<goto "Hub_1">>
<</button>>
</div><<silently>>
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _qid = "q_kael_missing_scouts_01">>
<<set _qIndex = -1>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qIndex = _i>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if _qIndex >= 0>>
<<set $quests[_qIndex].name = "The Missing Scouts">>
<<set $quests[_qIndex].desc = "Eogan has returned from the river search with word that unknown people were stalking Kael's scouts from the brush. The search is no longer only about the missing men.">>
<<set $quests[_qIndex].objective = "Use Expedition from camp to investigate the hidden group watching the river search.">>
<<set $quests[_qIndex].status = "active">>
<<set $quests[_qIndex].targetX = $campX>>
<<set $quests[_qIndex].targetY = $campY>>
<<set $quests[_qIndex].markerRevealed = true>>
<<set $quests[_qIndex].expeditionPassage = "Quest_q_kael_missing_scouts_01">>
<</if>>
<<set $questFlags["q_kael_missing_scouts_01_arrival_seen"] = true>>
<<set $trackedQuestId = _qid>>
<</silently>>
''<div class="hub-textbox">
At Kael’s urging, you have your hunters spread into smaller groups to cover more ground. You will keep searching for a few more days, and if no tracks turn up…
…you will assume the worst.
One day passes. Nothing.
Two days pass. Still no sign of them.
On the third, while you and Kael are discussing other matters inside the tent, a scout suddenly pushes his way inside.
“Chieftain!” he says, breathless. “My squad… we did not manage to find their tracks while searching. We were just about to turn back and return to camp, but...We saw movement in the bushes!”
The scout, Eogan, looks between you and Kael, excitement plain on his face, as though expecting the two of you to share in it.
Kael doesn't.
He only watches the younger man calmly, arms crossed over his chest, one eyebrow lifting just slightly. A moment passes. When Eogan still says nothing more, Kael speaks.
“…And?”
His tone is even.
“It could have been an animal. Or was it something else, Eogan?”
Eogan’s expression shifts at once, as if only now realizing he has rushed to the ending of his own tale. He scratches the back of his head.
“Ah. Right. We did not report it before because… well, we did not think much of it at the time. But over the last few days, while searching, we kept hearing bushes rustling. Branches shifting. Things moving around us.”
He swallows, then presses on.
“At first we thought it was just animals. But it kept happening. Every day it came a little closer. Every day it got a little bolder.”
His voice gains strength as he continues, the memory clearly stirring him.
“At one point, some of the men started thinking we might have angered the spirits somehow, wandering around so much, trampling through places we should not. That maybe they were trying to warn us away.”
He pauses.
“But when it happened again today, after I made one last check for tracks before turning back… I found them.”
Kael says nothing. Neither do you.
Eogan goes on.
“They did not belong to the missing men. Too small. And fresh. Fresh enough that they could not have been more than moments old.”
Now he turns fully toward you.
“We were being watched, Chieftain. Not by animals. Not by spirits. By men. Men who must have grown careless once they thought we were leaving.”
Silence settles over the tent once he finishes.
You and Kael listen without interruption, and when the scout has said all he has to say, you dismiss him with a nod. Eogan bows his head and quickly withdraws, leaving the two of you alone once more.
Kael stares at nothing in particular for a moment, deep in thought. Then, at last, he exhales through his nose and looks toward you.
“Well,” he says, “I am no longer certain we will find our men.”
His expression hardens.
“At least not alive.”
A brief pause follows.
“But we will certainly be finding someone.”
His gaze drifts toward the tent wall, as if already looking past it...Past the camp, past the tree line, into whatever waits beyond it.
“Definitely worth following up on,” he says at last. “If someone has been shadowing our search parties for days, then that means they have either claimed this stretch of land…”
He lets the thought hang.
“…or they believe they can.”
His eyes return to yours.
“Call for me when you are ready to set out, $user. I will handle other matters in the meantime.”
With that, Kael leaves the tent, leaving you alone with the weight of what Eogan has brought you...and with the growing certainty that this search is no longer only about the missing scouts.
<div class="result-list">
<div class="result-line good">
<span class="label">Task updated:</span>
<span class="value">Missing Scouts</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<endMajorEvent>>
<</button>>
</div><<silently>>
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set _attempts = Number($questFlags["q_kael_missing_scouts_01_attempts"] ?? 0)>>
<<set _dc = 14>>
<<set _hasSpark = !!($powersOwned and $powersOwned.spark)>>
<<set _stat = Number($wisdom ?? 0)>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _rawOk = (_total >= _dc)>>
<<set _kaelAssist = (!_rawOk and _attempts >= 1)>>
<<set _returnToCamp = (!_rawOk and not _kaelAssist)>>
<<set $kaelMissingScoutsTrailCheck = {
ok: (_rawOk or _kaelAssist),
rawOk: _rawOk,
assisted: _kaelAssist,
statKey: "Wisdom",
stat: _stat,
roll: _roll,
dc: _dc,
total: _total
}>>
<<if _returnToCamp>>
<<set $questFlags["q_kael_missing_scouts_01_attempts"] = _attempts + 1>>
<<else>>
<<set $questFlags["q_kael_missing_scouts_01_attempts"] = Math.max(_attempts, 1)>>
<<set $questFlags["q_kael_missing_scouts_01_trail_found"] = true>>
<<if _kaelAssist>><<set $questFlags["q_kael_missing_scouts_01_kael_assist"] = true>><</if>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You and Kael set out a few hours ago, making for the place Eogan described. It takes some time to find the tracks he mentioned, but in the end, you do.
True enough, even left this carelessly, they are difficult to follow—partly because of their age, and partly because whoever made them seems to move lightly even when they are not trying to.
<div class="result-list">
<<if $kaelMissingScoutsTrailCheck.rawOk>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom + d20 vs DC</span>
<span class="value"><<print $kaelMissingScoutsTrailCheck.total>> / <<print $kaelMissingScoutsTrailCheck.dc>></span>
</div>
<<if $kaelMissingScoutsTrailCheck.assisted>>
<div class="result-line good">
<span class="label">Progress</span>
<span class="value">Kael picks up the trail</span>
</div>
<<elseif not $kaelMissingScoutsTrailCheck.rawOk>>
<div class="result-line bad">
<span class="label">Outcome</span>
<span class="value">Return to camp and try again</span>
</div>
<</if>>
</div>
<<if $kaelMissingScoutsTrailCheck.rawOk>>
Still, neither your eyes nor your instincts fail you. Piece by piece, sign by sign, you manage to keep the trail, with Kael moving silently behind you.
<</if>>
<<if not $kaelMissingScoutsTrailCheck.rawOk and not $kaelMissingScoutsTrailCheck.assisted>>
It is difficult. Whoever left these tracks is clearly familiar with the terrain. You do your best to pick them up again whenever they fade, but by the end of it, you and Kael seem to be moving in circles.
In the end, you decide to return to camp for now and try again another day.
<</if>>
<<if $kaelMissingScoutsTrailCheck.assisted>>
Again, the tracks seem to dissolve into nothingness every time you think you have them. You search for sign after sign, but it all feels increasingly fruitless. Just as you are about to call an end to it for the day-
“Found them.”
Kael’s voice is calm, almost casual.
You turn to see him crouched low, gently brushing aside a layer of leaves and exposing the faint impression beneath.
“Come on,” he says. “Before the sun starts setting and we lose them again.”
<</if>>
<<if not _returnToCamp>>
The path you follow feels treacherous, not only because of the rough terrain, but because the great river offers a false sense of certainty. It makes you feel as though you always know where you are going, yet its bends and ridges seem almost determined to mislead you, pulling your sense of direction apart little by little.
Still, you press on.
And then-
A rustle.
A crack.
Then, faintly, the sound of drums.
Both you and Kael crouch at once as you draw closer to the source of the noise, your movements turning slow and careful. One step. Then another. The forest begins to thin.
And finally-
<</if>>
</div>''
<div class="hub-buttons">
<<if _returnToCamp>>
<<link "<span class='choice-text'>Return to camp</span>" "Hub_1">><</link>>
<<else>>
<<link "<span class='choice-text'>You see it</span>">>
<<goto "Quest_q_kael_missing_scouts_02">>
<</link>>
<</if>>
</div><<silently>><<set _hasSpark = !!($powersOwned and $powersOwned.spark)>><</silently>>
''<div class="hub-textbox">
A cluster of caves opens ahead, tucked into the landscape in such a way that they feel almost hidden from the world around them. Strange plant life grows thick around the entrances, isolated from the surrounding forest, as though the place were somehow separate from the land enclosing it. The river and dense growth around it conceal the site so well that, from a distance, it might never have been noticed at all.
Only now, standing this close, do you hear it clearly...the sounds of festivity coming from somewhere within. Voices. Movement. Drums. Something alive and communal, just out of sight deeper inside the caves.
From here, though, you still cannot make out exactly what is happening.
Kael lets out a quiet breath and motions for you to move back with him, deeper into the foliage. Once you have withdrawn a short distance, he settles against the trunk of a tree, his eyes never leaving the largest entrance.
“There seem to be quite a few of them in there,” he murmurs, “and they are sitting in a fairly defensible position too…”
Then he glances at you. His expression is a little more at ease than it usually is in camp, though his voice remains as dry as ever.
“Well. I am sure you could handle it forcefully if it comes to that. <<if _hasSpark>>Maybe with that little flame you summon with a wave of your hand-flush them out, hm?<</if>>”
Then his gaze shifts back toward the cave mouth.
“But it would be better to wait. Let things quiet down when night comes… just in case our scouts are in there.”
You nod, agreeing with the plan for now, and settle yourself against a tree of your own. You do not bother staring at the entrances. Your ears will warn you long before Kael’s eyes catch anything.
So you wait.
</div>''
<div class="hub-buttons">
<<if _returnToCamp>>
<<link "<span class='choice-num'>1</span><span class='choice-text'>Return to camp</span>" "Hub_1">><</link>>
<<else>>
<<link "<span class='choice-text'>Wait</span>">>
<<goto "Quest_q_kael_missing_scouts_03">>
<</link>>
<</if>>
</div>''<div class="hub-textbox">
Some time passes as the two of you sit in silence, waiting for the sounds from the caves to quiet.
Kael, for his part, remains focused on the largest entrance, his eyes never straying far from it as the sun slowly begins to sink. Then, without looking away, he speaks in a low voice.
“So,” he says, “enough time has passed that I may as well ask.”
A brief pause.
“How does being chieftain sit with you, $user?”
He asks it plainly, then waits with the same steady patience he seems to bring to everything else.
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>It feels right.</span>">>
<<set $kaelScoutTalkResponse = "right">>
<<goto "Quest_q_kael_missing_scouts_04">>
<</link>>
<<link "<span class='choice-text'>I am doing what must be done.</span>">>
<<set $kaelScoutTalkResponse = "duty">>
<<goto "Quest_q_kael_missing_scouts_04">>
<</link>>
<<link "<span class='choice-text'>It has been harder than I expected.</span>">>
<<set $kaelScoutTalkResponse = "difficult">>
<<goto "Quest_q_kael_missing_scouts_04">>
<</link>>
</div><<silently>>
<<set _ghostWalkCost = 35>>
<<set _hasGhostWalk = !!($powersOwned and $powersOwned.ghost_walk)>>
<<set _canGhostWalk = _hasGhostWalk and Number($belief ?? 0) >= _ghostWalkCost>>
<</silently>>
<<if false>>
''<div class="hub-textbox">
<<if $kaelScoutTalkResponse is "right">>
You explain that you are the strongets, your mind the quickest. Its only natural for you to lead /
Kael is quiet for a moment.
“Hm,” he says at last. “I thought that might be your answer.”
His eyes remain on the cave entrance, but there is no mockery in his voice.
“Since you first joined the tribe many moons ago, there was always something special about you. I saw it even when i was a child. It was also one of the reasons i vouched for you to take over when my father passed.”
<<elseif $kaelScoutTalkResponse is "duty">>
Kael gives a faint grunt, but something akin to an approving smile graces his face
“That sounds like you.”
He shifts slightly where he sits, though his gaze never leaves the caves.
“Wanting the role is one thing. Carrying it because no one else can is another. The second tends to last longer.”
Hes silent for a moment then adds
"You will take our tribe in a direction nobody else could $user. I truly belive that"
<<elseif $kaelScoutTalkResponse is "difficult">>
For a moment, Kael says nothing.
Then he nods once.
“It should be,” he says. “Anyone who finds it easy is either a fool, or not thinking hard enough.”
His tone remains even, but not cold.
“Too many lives bend around one pair of hands for it to be anything else.”
He looks away from the caves and to you, something akin to a smile gracing his face
"Still. I think you will grow into it. There is something special about you $user. Apart from the way you age, and the power you wield. I truly believe that"
<<else>>
Kael is silent for a moment, considering your answer without comment.
<</if>>
A brief silence follows.
Then Kael speaks again, his voice still low, as He shifts his weight against the tree.
“Still... being chieftain is not only about strength. Or being feared. Men can be made to kneel through fear. But that alone does not make them loyal. And it does not make them stay steady when things become difficult.”
<</if>>
''<div class="hub-textbox">
<<if $kaelScoutTalkResponse is "right">>
You explain that you are the strongest, and your mind the quickest. It is only natural for you to lead.
Kael is quiet for a moment.
“Hm,” he says at last. “I thought that might be your answer.”
His eyes remain on the cave entrance, but there is no mockery in his voice.
“Since you first joined the tribe many moons ago, there was always something special about you. I saw it even when I was a child. It was one of the reasons I vouched for you to take over when my father passed.”
<<elseif $kaelScoutTalkResponse is "duty">>
Kael gives a faint grunt, but something like an approving smile touches his face.
“That sounds like you.”
He shifts slightly where he sits, though his gaze never leaves the caves.
“Wanting the role is one thing. Carrying it because no one else can is another. The second tends to last longer.”
He is silent for a moment, then adds,
“You will take our tribe in a direction nobody else could, $user. I truly believe that.”
<<elseif $kaelScoutTalkResponse is "difficult">>
For a moment, Kael says nothing.
Then he nods once.
“It should be,” he says. “Anyone who finds it easy is either a fool, or not thinking hard enough.”
His tone remains even, but not cold.
“Too many lives bend around one pair of hands for it to be anything else.”
He looks away from the caves and toward you, something like a smile touching his face.
“Still, I think you will grow into it. There is something special about you, $user. And I do not only mean the way you age, or the power you wield. I truly believe that.”
<<else>>
Kael is silent for a moment, considering your answer without comment.
<</if>>
A brief silence follows.
Then Kael speaks again, his voice still low, as he shifts his weight against the tree.
“Still... being chieftain is not only about strength. Or being feared. Men can be made to kneel through fear. But that alone does not make them loyal. And it does not make them stay steady when things become difficult.”
He lets that hang between you for a moment.
“Belief matters. In a cause. In their lives improving. In gaining food, women, and safety. Or simply in the man leading them. As long as you can make our people believe in you...in what you represent...you will be unstoppable.”
The drums inside the caves, for their part, still do not seem to be quieting, even now that the sun has disappeared. The voices, too, sound no less energetic than when you first arrived.
Kael notices it as well.
“An energetic lot... unnaturally so...” he murmurs.
At last, his attention sharpens again, his posture straightening ever so slightly against the tree.
“I do not think waiting any longer will gain us anything else. What is the plan, $user?”
</div>''
<div class="hub-buttons">
<<if _canGhostWalk>>
<<link "<span class='choice-text'>Sneak in by yourself</span><span class='choice-note'>[Ghost Walk: <<print _ghostWalkCost>> Belief]</span>">>
<<set $belief = Math.max(0, Number($belief ?? 0) - _ghostWalkCost)>>
<<set $kaelScoutApproach = "ghost_walk">>
<<goto "Quest_q_kael_missing_scouts_05_ghostwalk">>
<</link>>
<<else>>
<span class="macro-button disabled" title="<<print _hasGhostWalk ? ('Need ' + _ghostWalkCost + ' Belief.') : 'You have not acquired Ghost Walk.'>>">
<span class="choice-text">Sneak in by yourself</span>
<span class="choice-note">[Ghost Walk: <<print _ghostWalkCost>> Belief]</span>
</span>
<</if>>
<<link "<span class='choice-text'>Sneak closer with Kael</span>">>
<<set $kaelScoutApproach = "kael">>
<<goto "Quest_q_kael_missing_scouts_05_sneak">>
<</link>>
</div><<silently>>
<<run (function () {
try {
const V = (typeof State !== "undefined" && State.variables) ? State.variables : null;
const currentTrack = String((V && V.musicState && V.musicState.track) || "");
if (currentTrack && currentTrack !== "drip" && currentTrack !== "Caves") {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack(currentTrack);
} else {
const current = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select(currentTrack)
: null;
if (current && typeof current.stop === "function") current.stop();
}
}
if (V) {
V.mainThemeActive = false;
V.introActive = false;
V.battleActive = false;
}
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("drip")
: null;
if (!tr) return;
try { tr.stop(); } catch (e) {}
try { tr.loop(true); } catch (e) {}
try {
const base = (setup.audio && setup.audio.getSfxVolume01)
? setup.audio.getSfxVolume01()
: ((settings.masterVolume ?? 10) / 10);
tr.volume(Math.max(0, Math.min(1, base * 0.58)));
} catch (e) {}
try {
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
} catch (e) {}
} catch (e) {}
})()>>
<</silently>>
''<div class="hub-textbox">
You tell Kael that you will handle this part yourself.
He raises an eyebrow, but does not question it. Instead, he gives a short nod.
“Alright,” he says. “I will keep watch here. Be careful in there.”
With that, you leave him behind and make your way toward the caves alone.
You do not bother with one of the smaller side entrances. There is no need. Instead, you head straight for the large central entrance, stepping into the darkness beyond.
One step.
Then another.
As your power settles over you, the feeling is familiar—that subtle slipping of attention, the strange sense that any watching eye will find an answer for your presence before it ever reaches a real question.
Then-
“Wait. Stop!”
The voice rings out from ahead, sharp enough to halt you in place. A moment later, two men carrying spears emerge from the darkness and approach.
One of them looks you up and down, frowning, then gestures toward the ground in front of you.
“Are you a moron?” he says. “You nearly stepped on a trap. Trying to lose a leg?”
Only now do you notice the half-hidden cord stretched low across the stone.
The other man gives you a lazy look, as though he recognizes you, or at least sees no reason not to.
“What took you so long, anyway?” he asks casually. “The festivities are already underway.”
The first glances at him and raises an eyebrow.
“And when are they not?”
The two exchange a look, then shrug before turning back to you.
“Anyway, go on through,” the first says. “The two of us are stuck on watch duty for another few hours yet.”
Then, as an afterthought, he adds,
“But make sure ''Aífa'' saves some of the sap for us, alright?”
By the time he finishes, you are already walking past them.
As you round the next bend, you hear one of them scratch at his head before turning to the other.
“Uh...” he says. “What was his name again?”
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Continue</span>">>
<<goto "Quest_q_kael_missing_scouts_05_ghostwalk_02">>
<</link>>
</div><<silently>>
<<run setup.playNamedTrackFadeIn ? setup.playNamedTrackFadeIn("Caves", {
stopAll: false,
durationMs: 2600,
startRatio: 0.04,
targetVolume: (((setup.audio && setup.audio.getMusicVolume01) ? setup.audio.getMusicVolume01() : ((settings.masterVolume ?? 10) / 10)) * 0.72),
source: "scene"
}) : (function () {
try {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("Caves")
: null;
if (!tr) return;
try { tr.stop(); } catch (e) {}
try { tr.loop(true); } catch (e) {}
try {
const base = (setup.audio && setup.audio.getMusicVolume01)
? setup.audio.getMusicVolume01()
: ((settings.masterVolume ?? 10) / 10);
tr.volume(Math.max(0, Math.min(1, base * 0.72)));
} catch (e) {}
try {
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
} catch (e) {}
try {
if (State && State.variables) {
State.variables.musicState = State.variables.musicState || { playing:false, track:"", source:"" };
State.variables.musicState.playing = true;
State.variables.musicState.track = "Caves";
State.variables.musicState.source = "scene";
State.variables.introActive = false;
State.variables.mainThemeActive = false;
State.variables.battleActive = false;
}
} catch (e) {}
} catch (e) {}
})()>>
<</silently>>
''<div class="hub-textbox">
In front of you, beyond the final bend of the cave, opens a chamber far larger than you expected.
And within it...
A scene of debauchery.
The festivities seem endless. A handful of men beat drums while women dance among the rest, laughing softly as they caress one another, press close, and move in slow, sensual rhythm. Some bodies lie sprawled across the stone floor, passed out where they fell. Others remain tangled together, flesh against flesh, seemingly uncaring of anything beyond their own immediate pleasures.
And yet, after watching for a few moments longer, only one among them seems truly in command of her senses.
A woman sits upon a broad stone overlooking the whole scene, her posture relaxed, her attention seemingly more focused on the strange leaf turning in her fingers than on the chaos unfolding beneath her.
Then you take a step forward.
Then another.
And at once your senses begin to come under assault.
First, your sense of smell. The air is thick, sweet, damp, almost cloying, full of the scent of crushed plants, sweat, and something stranger beneath it.
Then your hearing begins to slip. The drums seem louder now, deeper, as though the rhythm is no longer filling the chamber but pressing directly into your skull. Each beat feels heavier than the last.
Before you can steady yourself, a few of the women notice you.
They drift toward you with soft laughter, their voices light and playful, their movements unhurried. One brushes against your side. Another lets her hands wander across your chest, slow and familiar, their feminine giggles surrounding you.
The laughter, the scent, the warmth of their bodies, it all presses in at once.
Seeing this, feeling this, you decide to:
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Focus</span>">>
<<set $kaelGhostwalkResponse = "focus">>
<<goto "Quest_q_kael_missing_scouts_05_ghostwalk_03">>
<</link>>
<<link "<span class='choice-num'>2</span><span class='choice-text'>Indulge yourself</span>">>
<<set $kaelGhostwalkResponse = "indulge">>
<<goto "Quest_q_kael_missing_scouts_05_ghostwalk_03">>
<</link>>
</div><<silently>><<set $kaelScoutsGhostwalkSeen = true>><</silently>>''<div class="hub-textbox">
<<if $kaelGhostwalkResponse is "focus">>
You blink once, then again, before shaking your head and forcing yourself back into focus.
The women pressing against you seem startled only for a moment as you push past them. One stumbles aside, and in the process the vessel she had been raising toward your lips slips from her grasp and falls to the ground.
It spills across the stone.
At once, it becomes clear that this must be the “sap” the guards mentioned.
Even after being shoved away, the women do not seem especially bothered. In fact, they hardly seem to notice at all. Their attention simply drifts elsewhere, settling back on one another as though nothing had happened.
You look around, and it only takes a moment to recognize the two men writhing among the others on the cave floor.
Your missing scouts.
Alive... but perhaps not well.
Even from this close, they do not recognize you. Their eyes are unfocused, their movements loose and thoughtless, their bodies swaying only to the rhythm of the drums and the hands laid upon them.
You reach down to seize one by the shoulder-
And suddenly your hand is caught.
Lifted.
A smaller hand has found yours, palm pressing against palm, fingers slowly threading between your own as a woman steps close enough for you to feel the warmth of her breath.
She smiles lightly.
It is the same woman who had been sitting upon the stone.
“Hm...” she murmurs. “And what do you think you are doing?”
Her voice is calm, faintly sensual, each word seeming to brush against your ear rather than merely reach it.
“We should not interrupt our guests until they tire themselves out, should we?”
Only now, seeing her up close, do you truly take in her age, and how little it seems to matter beside her beauty.
“Hm... and tell me,” she continues, studying you with open interest, “why are you not enjoying the festivities with the rest?”
Her gaze moves over you slowly, carefully.
“There is something strange about that, is there not?”
She is looking at you too closely.
Too clearly.
You feel Ghostwalk begin to strain under the weight of a sharp and searching mind.
Without answering, you pull your hand free and take a step back. Then another.
At last, you turn fully and make your way back toward the entrance.
The woman you leave behind watches you curiously, but does not follow. Your power still holds—barely—as you slip from the chamber, return to Kael, and make your way back to camp for now.
<</if>>
<<if $kaelGhostwalkResponse is "indulge">>
You let their hands roam across you.
One of the women lifts a shallow leaf-cup to your lips, and this time you do not resist. You drink, and at once you know this must be the “sap” the guards mentioned.
Its effect is immediate.
It spreads across your tongue, then through your senses, then deeper still—until the drums feel louder, the laughter warmer, the air heavier, and the touch of every hand more difficult to separate from thought itself.
For a time, you let yourself be carried by it.
<<nsfwimg "images/expeditions/MissingScouts/indulge.gif">>
The cave, the dancers, the scent of crushed plants and sweat, the slow rhythm of flesh and music...It all swallows you up in a blur of heat and sensation.
And yet, unlike the others, your clarity returns quickly.
Almost as quickly as it left.
As your mind sharpens again, the scene comes back into focus. And there, among the bodies on the stone floor, you finally recognize them:
your missing scouts.
Alive, but lost to whatever spell, sap, or ritual has taken hold of this place.
You connect enough pieces to understand the shape of it.
Enough to know what happened to them.
Enough to know you should not remain here any longer.
But in that brief lapse, Ghostwalk has weakened.
So you turn to leave.
Before you can fully withdraw, your eyes meet those of the woman seated upon the stone. Only now, seeing her clearly, do you fully notice her beauty, and the intelligence behind it.
She watches you.
You do not stay to test whether she has seen too much.
Instead, you turn away, slip back toward the entrance, reunite with Kael, and return to camp for now.
<</if>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Return to camp</span>">>
<<goto "Quest_q_kael_missing_scouts_return">>
<</link>>
</div><<silently>>
<<run (function () {
try {
const V = (typeof State !== "undefined" && State.variables) ? State.variables : null;
const currentTrack = String((V && V.musicState && V.musicState.track) || "");
if (currentTrack && currentTrack !== "drip" && currentTrack !== "Caves") {
if (setup.stopSimpleAudioTrack) {
setup.stopSimpleAudioTrack(currentTrack);
} else {
const current = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select(currentTrack)
: null;
if (current && typeof current.stop === "function") current.stop();
}
}
if (V) {
V.mainThemeActive = false;
V.introActive = false;
V.battleActive = false;
}
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("drip")
: null;
if (!tr) return;
try { tr.stop(); } catch (e) {}
try { tr.loop(true); } catch (e) {}
try {
const base = (setup.audio && setup.audio.getSfxVolume01)
? setup.audio.getSfxVolume01()
: ((settings.masterVolume ?? 10) / 10);
tr.volume(Math.max(0, Math.min(1, base * 0.58)));
} catch (e) {}
try {
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
} catch (e) {}
} catch (e) {}
})()>>
<</silently>>
''<div class="hub-textbox">
As you tell Kael that the two of you will be sneaking in, he gives a small nod and follows after you without protest.
Together, you make your way toward one of the smaller entrances off to the side, moving carefully through the undergrowth until the cave mouth opens before you.
Inside, the place is quiet.
Quieter than it seemed from outside.
The drums and voices still echo faintly through the stone, but here—at the edges of the cave system—they feel distant, muffled, as though the rock itself is swallowing part of the sound before it can reach you.
And the place feels... alive.
The cave walls are thick with strange flora, more than should have any right to grow in a place like this. Pale vines creep along the damp stone. Wide-leafed growths cling to cracks in the rock. Clusters of soft, swollen flowers hang low in places, their shapes unfamiliar, their scent faint but heavy in the still air.
Neither you nor Kael speaks.
There is no need.
You simply press on, deeper and deeper, moving toward the distant beat of drums and the murmur of voices, careful not to let your steps carry farther than the sound itself.
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Continue</span>">>
<<goto "Quest_q_kael_missing_scouts_sneak_02">>
<</link>>
</div><<silently>>
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("drip") : null>>
<<run setup.stopSimpleAudioTrack ? setup.stopSimpleAudioTrack("Caves") : null>>
<<set _missingQuestId = "q_kael_missing_scouts_01">>
<<set _missingQuestIndex = -1>>
<<set _caveQuestX = Number($campX ?? 0)>>
<<set _caveQuestY = Number($campY ?? 0)>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _missingQuestId>>
<<set _missingQuestIndex = _i>>
<<break>>
<</if>>
<</for>>
<<if _missingQuestIndex gte 0>>
<<set _caveQuestX = Number($quests[_missingQuestIndex].targetX ?? _caveQuestX)>>
<<set _caveQuestY = Number($quests[_missingQuestIndex].targetY ?? _caveQuestY)>>
<<set $quests[_missingQuestIndex].desc = "You found Kael's missing scouts alive inside a hidden cave settlement, but whatever the people there are using has left them lost in a haze of pleasure and confusion.">>
<<set $quests[_missingQuestIndex].objective = "The scouts have been found. Decide how your tribe will deal with the hidden cave people.">>
<<set $quests[_missingQuestIndex].status = "complete">>
<<set $quests[_missingQuestIndex].markerRevealed = false>>
<<set $quests[_missingQuestIndex].expeditionPassage = "">>
<</if>>
<<set $questFlags["q_kael_missing_scouts_returned"] = true>>
<<addQuestMarkerless
"q_kael_cave_tribe_01"
"The Cave Tribe"
"You found the missing scouts alive inside a hidden cave settlement. The tribe living there seems to wield some intoxicating mixture or influence strong enough to numb reason and self-control."
"You have located the cave tribe. Decide how your people will deal with them."
"Quest_q_kael_cave_tribe_01"
>>
<<set _caveQuestIndex = -1>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is "q_kael_cave_tribe_01">>
<<set _caveQuestIndex = _i>>
<<break>>
<</if>>
<</for>>
<<if _caveQuestIndex gte 0>>
<<set $quests[_caveQuestIndex].targetX = _caveQuestX>>
<<set $quests[_caveQuestIndex].targetY = _caveQuestY>>
<<set $quests[_caveQuestIndex].markerRevealed = true>>
<<set $quests[_caveQuestIndex].expeditionPassage = "Quest_q_kael_cave_tribe_01">>
<</if>>
<<set $trackedQuestId = "q_kael_cave_tribe_01">>
<</silently>>
''<div class="hub-textbox">
As you make your way back to camp, Kael lets out a slow sigh and cracks his neck.
“Well,” he says, “we have our answers at last. Now all that remains is deciding how to solve the problem.”
He turns to look at you.
“Whatever sorcery they are using seems equally dangerous and useful. Either way, it is probably something best kept in our hands... or in no one’s hands at all.”
Then he gives a small shrug.
“That is my view on it, at any rate. As always, the final decision lies with you, Chieftain. I will have the men ready. Just say the word.”
With that, he turns and leaves to see to other matters around camp, seemingly untouched by the whole ordeal...or at least unwilling to show otherwise.
Impressive, for one who lacks your unnatural stamina.
<div class="result-list">
<div class="result-line good">
<span class="label">Quest completed</span>
<span class="value">The Missing Scouts</span>
</div>
<div class="result-line good">
<span class="label">New quest added</span>
<span class="value">The Cave Tribe</span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Continue</span>">>
<<goto "Hub_1">>
<</link>>
</div><<silently>>
<<set _dc = 12>>
<<set _roll = random(1, 20)>>
<<set _stat = Number($endurance ?? 0)>>
<<set _total = _stat + _roll>>
<<set _success = (_total >= _dc)>>
<<set $kaelScoutSneakCheck = {
ok: _success,
statKey: "Endurance",
stat: _stat,
roll: _roll,
dc: _dc,
total: _total
}>>
<</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if $kaelScoutSneakCheck.ok>>
<div class="result-line good">
<span class="label">Task check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Task check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Endurance + d20 vs DC</span>
<span class="value"><<print $kaelScoutSneakCheck.total>> / <<print $kaelScoutSneakCheck.dc>></span>
</div>
</div>
As the sound of the drums grows louder, your head begins to feel strangely light.
<<if $kaelScoutSneakCheck.ok>>
Still, you manage to shake it off for the time being.
You glance back at Kael. He seems steady, but you notice the movement of his jaw-subtle, deliberate. He is biting his tongue, keeping himself focused through the discomfort.
So. He feels it too.
<<else>>
Slowly, you begin to feel your baser urges swelling up from somewhere deep inside you. The rhythmic drums no longer sound distant or incidental. They feel directed. Measured. As though they are calling specifically to you, drawing you farther in.
Your steps begin to drift-
Then you feel a hand on your shoulder. Once. Twice.
You turn, your thoughts sharpening again, and find Kael standing close behind you.
“You need to stay focused, $user. You were drifting off to the side.”
His voice is low and controlled. Only now do you notice the movement in his mouth as well, the way his jaw tightens every few moments.
He is biting his tongue.
It seems there is something deeply strange about this place.
<</if>>
You push forward a little farther, until at last the narrow passage opens into a wider chamber of the cave.
And finally, you-
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>See it</span>">>
<<goto "Quest_q_kael_missing_scouts_sneak_03">>
<</link>>
</div><<silently>>
<<run setup.playNamedTrackFadeIn ? setup.playNamedTrackFadeIn("Caves", {
stopAll: false,
durationMs: 2600,
startRatio: 0.04,
targetVolume: (((setup.audio && setup.audio.getMusicVolume01) ? setup.audio.getMusicVolume01() : ((settings.masterVolume ?? 10) / 10)) * 0.72),
source: "scene"
}) : (function () {
try {
const tr = (typeof SimpleAudio !== "undefined" && typeof SimpleAudio.select === "function")
? SimpleAudio.select("Caves")
: null;
if (!tr) return;
try { tr.stop(); } catch (e) {}
try { tr.loop(true); } catch (e) {}
try {
const base = (setup.audio && setup.audio.getMusicVolume01)
? setup.audio.getMusicVolume01()
: ((settings.masterVolume ?? 10) / 10);
tr.volume(Math.max(0, Math.min(1, base * 0.72)));
} catch (e) {}
try {
const p = tr.play();
if (p && typeof p.catch === "function") p.catch(function () {});
} catch (e) {}
try {
if (State && State.variables) {
State.variables.musicState = State.variables.musicState || { playing:false, track:"", source:"" };
State.variables.musicState.playing = true;
State.variables.musicState.track = "Caves";
State.variables.musicState.source = "scene";
State.variables.introActive = false;
State.variables.mainThemeActive = false;
State.variables.battleActive = false;
}
} catch (e) {}
} catch (e) {}
})()>>
<<set _passedEndurance = !!($kaelScoutSneakCheck and $kaelScoutSneakCheck.ok)>>
<<set $kaelScoutsWisdomPassed = false>>
<<if _passedEndurance>>
<<set _wisdomDc = 8>>
<<set _wisdomRoll = random(1, 20)>>
<<set _wisdomStat = Number($wisdom ?? 0)>>
<<set _wisdomTotal = _wisdomStat + _wisdomRoll>>
<<set _wisdomSuccess = (_wisdomTotal >= _wisdomDc)>>
<<set $kaelScoutsWisdomPassed = _wisdomSuccess>>
<<set $kaelScoutCaveInsightCheck = {
ok: _wisdomSuccess,
statKey: "Wisdom",
stat: _wisdomStat,
roll: _wisdomRoll,
dc: _wisdomDc,
total: _wisdomTotal
}>>
<<else>>
<<set $kaelScoutCaveInsightCheck = { ok: false, skipped: true, statKey: "Wisdom", dc: 8 }>>
<</if>>
<</silently>>
''<div class="hub-textbox">
In front of you, in the surprisingly large chamber beyond, lies a surprising sight.
A scene of debauchery.
The festivities seem endless. A handful of men beat drums while women dance among the rest, laughing softly as they caress one another, press close, and move in slow, sensual rhythm. Some bodies lie sprawled across the stone floor, passed out where they fell. Others remain tangled together, mingling flesh with flesh, seemingly uncaring of anything beyond their own immediate pleasures.
<<nsfwimg "images/expeditions/MissingScouts/dance.webp">>
And yet, after watching for a few moments longer, only one among them seems truly in command of her senses.
A woman sits upon a broad stone overlooking the whole scene, her posture relaxed, her attention seemingly more focused on the strange leaf turning in her fingers than on the chaos unfolding beneath her.
<<if _passedEndurance>>
<div class="result-list">
<<if $kaelScoutCaveInsightCheck.ok>>
<div class="result-line good">
<span class="label">Wisdom check</span>
<span class="value">PASS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Wisdom check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Wisdom + d20 vs DC</span>
<span class="value"><<print $kaelScoutCaveInsightCheck.total>> / <<print $kaelScoutCaveInsightCheck.dc>></span>
</div>
</div>
<</if>>
<<if _passedEndurance and $kaelScoutCaveInsightCheck.ok>>
The sight is distracting in its own way, but another thought presses at the edge of your mind.
This cave. This flora. The people here.
It all feels unnatural.
You have never seen plants like these before, and this place is thick with them. A concoction, perhaps. Some brew, smoke, or salve made from the growth surrounding the chamber. Yes... that would explain part of it.
But only part.
What you felt earlier was too strong, too immediate, to be caused by the plants alone. There is something more to whatever these people are using.
Something worth remembering.
<</if>>
Kael, crouched beside you, points quietly toward a cluster of bodies on the ground.
“Those two men there,” he whispers. “With the women. Those are our missing scouts.”
His expression hardens slightly.
“But they are not in their right minds. This place is affecting them.”
He watches the chamber for a moment longer before speaking again, his voice flat and controlled.
“I recommend we return to camp for now and decide on a plan of action, $user. We have time.”
His eyes flick once more toward the sprawled figures of your men.
“I do not think they will be going anywhere.”
</div>''
<div class="hub-buttons">
<<link "<span class='choice-text'>Pull back for now</span>">>
<<goto "Quest_q_kael_missing_scouts_return">>
<</link>>
</div><<silently>>
<<set $energy = Math.max(0, Number($energy || 0) - 1)>>
/* find quest */
<<set _qid = "q_valued_item_01">>
<<set _q = null>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i].id is _qid>>
<<set _q = $quests[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<</silently>>
''<div class="hub-textbox">
The forest thickens here.
Branches claw at your shoulders as you force your way through undergrowth still bent from recent passage. Broken twigs. Scuffed earth.
Someone ran through here—hard.
And not long ago.
Something hangs from a low branch ahead.
Wood. Twine. Carved markings, dulled by dirt and sap.
As you draw closer, the shape resolves—smoothly carved wood, unmistakable in its intent. Detailed etchings run along its length, and the surface has been worn down in a few places…
…the kind of wear that doesn’t come from weather.
Halona catches up behind you.
The moment she sees it, relief flashes across her face—bright and immediate.
“There it is!” she blurts, already stepping forward to snatch it back.
</div>''
<div class="hub-buttons">
<<button "Suggest something fun">>
<<set $q_valued_item_01_choice = "suggest">>
<<goto "Quest_q_valued_item_01_Resolve">>
<</button>>
<<button "Let it go">>
<<set $q_valued_item_01_choice = "return">>
<<goto "Quest_q_valued_item_01_Resolve">>
<</button>>
</div><<silently>>
<<set _qid = "q_valued_item_01">>
<<set _q = null>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i].id is _qid>>
<<set _q = $quests[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
/* mark quest complete */
<<if _q>>
<<set _q.status = "complete">>
<</if>>
/* apply affection reward (both outcomes) */
<<if $people and $people.length>>
<<for _j = 0; _j < $people.length; _j++>>
<<if $people[_j].id is "npc_outcast">>
<<set $people[_j].love = Number($people[_j].love ?? $people[_j].trust ?? 0) + 10>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _choice = $q_valued_item_01_choice ?? "return">>
<</silently>>
''<div class="hub-textbox">
<<if _choice is "suggest">>
You offer a different use for her totem— something that has nothing to do with ceremony.
Halona freezes.
Her eyes widen, mouth parting in real shock. For a moment she just stares at you… then down at the totem in her hand.
She turns it over as if seeing it for the first time.
Color climbs into her cheeks.
“You… you dare suggest such a thing?” she sputters, indignation snapping sharp. “This is a sacred object—carved by my grandmother to honor fertility rites and tribal strength!”
She straightens, pride clicking back into place like a shield.
“You are <i>lucky</i> I owe you for saving both me and my brother,” she says coldly. “My debt is too large to strike you for even suggesting such a… depraved use.”
And yet—
her fingers trace the carved length almost absently.
The spark in her eyes doesn’t quite match her outrage.
“Still,” she adds after a beat, quieter now, “perhaps we could… discuss this further.”
Her gaze flicks away.
“Away from prying eyes.”
<<else>>
You take the totem down and place it in Halona’s hands without a word.
Relief loosens her shoulders immediately.
“Thank you,” she says, the sincerity plain. Her fingers brush yours in the exchange—brief, but not nothing.
“I was afraid it was lost forever.”
She cradles it with reverence, almost oblivious to its suggestive shape.
“My grandmother carved this,” she explains, turning it slowly. “It’s a symbol of fertility and strength in my tribe. I carry it whenever I travel unfamiliar land.”
Her gaze lingers on you a little longer than before.
“I owe you a debt,” she says quietly. “Few would search so hard for something so… personal.”
When you turn back toward camp, her posture is less rigid.
And she walks closer than before.
<</if>>
<br><br>
<div class="result-list">
<div class="result-line good">
<span class="label">Quest</span>
<span class="value">Completed</span>
</div>
<div class="result-line">
<span class="label">Outcome</span>
<span class="value"><<print _choice is "suggest" ? "Suggested something fun" : "Let it go">></span>
</div>
<div class="result-line good">
<span class="label">Affection</span>
<span class="value">+10 (Halona)</span>
</div>
<<if _choice is "suggest">>
<div class="result-line">
<span class="label">Unlocked</span>
<span class="value">Secret follow-up</span>
</div>
<</if>>
</div>
</div>''
<div class="hub-buttons">
<<button "Return to camp">>
<<if _choice is "suggest">>
<<goto "Quest_q_valued_item_01_Secret">>
<<else>>
<<goto "Hub_1">>
<</if>>
<</button>>
</div>''<div class="hub-textbox">
Back in her tent, firelight flickers low, casting slow-moving shadows across the stretched hides that serve as walls.
Halona sits opposite you, the totem resting loosely in her hands. Her expression is carefully blank—too carefully.
“Such a depraved suggestion,” she mutters at last, eyes lifting to meet yours. “Only someone twisted would look at a sacred object and see… something else.”
Despite the words, she doesn’t cover herself.
Her fingers trace the carved patterns instead—slow, deliberate, lingering far longer than needed.
<<nsfwimg "images/Expeditions/ValuedItem/ValuedItem1.gif">>
She shifts.
The simple hide garment slips aside, baring her thighs in the firelight. You don’t speak. You don’t need to.
“You’re enjoying this, aren’t you?” she says, accusing—but there’s no bite behind it. “Watching me defile something sacred for your satisfaction.”
Her gaze sharpens. “Aren’t you, $user?”
Her hand drifts lower.
The carved tip brushes against her, and a soft gasp escapes before she can stop it.
“This is ridiculous,” she murmurs.
But her body betrays her as she parts her legs further.
“I’m only doing this because I owe you a debt,” she adds quickly. “Nothing more.”
<<nsfwimg "images/Expeditions/ValuedItem/ValuedItem2.gif">>
The totem slides deeper.
Her breath stutters. Her eyes close—just for a moment—before opening again to fix on you.
“Don’t look so pleased,” she pants, beginning to move it with an unsteady rhythm. “This means nothing. It’s just… curiosity.”
Her hips start to follow her hand.
Resistance fades. Words soften. Insults lose their edge.
“Perverted… watching me like this…” she manages, voice thick. “You’re lucky I—oh…”
<<nsfwimg "images/Expeditions/ValuedItem/ValuedItem3.gif">>
Her movements grow faster, more urgent.
Firelight gleams along the carved wood as she works it deeper, one hand clawing into the furs beneath her.
“You probably think this means something,” she gasps, body arching. “That I want you… that I’m enjoying this…”
The rest dissolves into a sharp cry.
Her body tenses, then shudders—muscles clenching hard around the totem as the release takes her. For a moment, she is utterly silent, trembling.
When her eyes finally open, they’re unfocused—hazy with the aftermath.
She withdraws the totem slowly, fingers unsteady.
“There,” she says, breath still uneven. “Your debt is paid.”
Her gaze hardens again, armor snapping back into place.
“Now get out.”
</div>''
<div class="hub-buttons">
<<button "Continue">>
<<goto "Hub_1">>
<</button>>
</div><<nobr>>
<<silently>>
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<if !$untrackedQuestIds>><<set $untrackedQuestIds = []>><</if>>
/* Collect active quest IDs */
<<set _activeQuestIds = []>>
<<if $quests and $quests.length>>
<<for _a = 0; _a < $quests.length; _a++>>
<<set _q = $quests[_a]>>
<<if _q and _q.status is "active">>
<<set _qid = String(_q.id)>>
<<if _qid and _activeQuestIds.indexOf(_qid) is -1>>
<<set _activeQuestIds.push(_qid)>>
<</if>>
<</if>>
<</for>>
<</if>>
/* Prune tracked to active */
<<set _newTracked = []>>
<<for _b = 0; _b < $trackedQuestIds.length; _b++>>
<<set _tid = String($trackedQuestIds[_b])>>
<<if _activeQuestIds.indexOf(_tid) >= 0 and _newTracked.indexOf(_tid) is -1>>
<<set _newTracked.push(_tid)>>
<</if>>
<</for>>
<<set $trackedQuestIds = _newTracked>>
/* Prune untracked to active */
<<set _newUntracked = []>>
<<for _c = 0; _c < $untrackedQuestIds.length; _c++>>
<<set _uid = String($untrackedQuestIds[_c])>>
<<if _activeQuestIds.indexOf(_uid) >= 0 and _newUntracked.indexOf(_uid) is -1>>
<<set _newUntracked.push(_uid)>>
<</if>>
<</for>>
<<set $untrackedQuestIds = _newUntracked>>
/* Ensure tracked doesn't contain explicit untracked */
<<set _cleanTracked = []>>
<<for _d = 0; _d < $trackedQuestIds.length; _d++>>
<<set _tid2 = String($trackedQuestIds[_d])>>
<<if $untrackedQuestIds.indexOf(_tid2) is -1 and _cleanTracked.indexOf(_tid2) is -1>>
<<set _cleanTracked.push(_tid2)>>
<</if>>
<</for>>
<<set $trackedQuestIds = _cleanTracked>>
/* Default: track all active quests unless explicitly untracked */
<<for _e = 0; _e < _activeQuestIds.length; _e++>>
<<set _aid = _activeQuestIds[_e]>>
<<if $untrackedQuestIds.indexOf(_aid) is -1 and $trackedQuestIds.indexOf(_aid) is -1>>
<<set $trackedQuestIds.push(_aid)>>
<</if>>
<</for>>
<</silently>>
<div class="quests-screen">
<section class="quests-board">
<header class="quests-board-header">
<div class="quests-heading">
<div class="quests-kicker">Quest Board</div>
<h2 class="quests-title">Tasks</h2>
<p class="quests-subtitle">Keep only the objectives you care about tracked on the map. The marker state below tells you what the wilderness will currently reveal.</p>
</div>
<div class="quests-summary">
<span class="quests-summary-pill"><<print _activeQuestIds.length>> active</span>
<span id="quests-tracked-count" class="quests-summary-pill quests-summary-pill-dim"><<print $trackedQuestIds.length>> tracked</span>
<div class="char-return quest-return">
<<return>>
</div>
</div>
</header>
<<if !_activeQuestIds.length>>
<div class="quests-empty">
<div class="quests-empty-kicker">Nothing pressing</div>
<div class="quests-empty-title">No active tasks yet.</div>
<p class="quests-empty-copy">Explore, survive, and let events unfold. New tasks will be recorded here when the world gives you something worth following.</p>
</div>
<<else>>
<div class="quests-list">
<<for _i = 0; _i < $quests.length; _i++>>
<<set _q = $quests[_i]>>
<<if _q and _q.status is "active">>
<<set _qid = String(_q.id)>>
<<set _qname = _q.name>>
<<set _tracked = ($trackedQuestIds.indexOf(_qid) >= 0)>>
<article class="quest-card">
<div class="quest-top">
<div class="quest-title-block">
<div class="quest-kicker">Active task</div>
<div class="quest-name"><<print _qname>></div>
</div>
<div class="quest-state">
<span class="quest-track-state-live" @id="'quest-track-state-' + _qid"><<QuestTrackedStateTag _qid>></span>
<<if _q.markerRevealed>>
<span class="quest-tag quest-tag-marker">Marker revealed</span>
<<else>>
<span class="quest-tag quest-tag-dim">Marker hidden</span>
<</if>>
</div>
</div>
<<if _q.desc>>
<div class="quest-desc"><<print _q.desc>></div>
<</if>>
<<if _q.objective>>
<div class="quest-obj">
<div class="quest-obj-label">Next step</div>
<div class="quest-obj-inner"><<print _q.objective>></div>
</div>
<</if>>
<div class="quest-actions-row">
<div class="quest-actions"><<QuestTrackToggle _qid>></div>
</div>
</article>
<</if>>
<</for>>
</div>
<</if>>
<div class="quests-toast muted">
<<if $questsToastText>><<print $questsToastText>><</if>>
</div>
<<silently>><<set $questsToastText = "">><</silently>>
</section>
<div class="quests-side-void" aria-hidden="true"></div>
</div>
<</nobr>>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>><<silently>>
<<set _tid = String($activeTribeId ?? $raidTargetId ?? "")>>
<<set _t = null>>
<<if $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if String($tribes[_i].id) is _tid>>
<<set _t = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _name = (_t and _t.name) ? _t.name : "this tribe">>
<</silently>>
You consider raiding <b><<print _name>></b>. How will you approach?
<<if (Number($energy ?? 0) >= 2)>>
<<link "1) Assemble a raid party (2 AP)" "Raid_Party_Intro">>
<<set $raidMode = "party">>
<<run Dialog.close()>>
<</link>>
<<else>>
<span class="macro-button disabled" title="Not enough Action Points">1) Assemble a raid party (2 AP)</span>
<</if>>
<br>
<<if (Number($energy ?? 0) >= 1)>>
<<link "2) Go alone (1 AP)" "Raid_Solo_Intro">>
<<set $raidMode = "alone">>
<<run Dialog.close()>>
<</link>>
<<else>>
<span class="macro-button disabled" title="Not enough Action Points">2) Go alone (1 AP)</span>
<</if>><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = $raidCtx.log ?? {}>>
/* Apply once (so DC doesn't change if you revisit) */
<<if !$raidCtx.combatSetupDone>>
<<set $raidCtx.combatSetupDone = true>>
/* Get the active target tribe safely */
<<set _t = (setup.tribes && setup.tribes.getActiveTribe) ? setup.tribes.getActiveTribe() : null>>
/* Enemy mil strength (TwineScript-safe) */
<<set _enemyMil = Number((_t && _t.stats) ? (_t.stats.milStr ?? 0) : 0)>>
/* Ensure our mil is fresh, then use it */
<<if setup.player && setup.player.recalcMilStr>>
<<run setup.player.recalcMilStr()>>
<</if>>
<<set _ourMil = Number($playerMilStr ?? 0)>>
/* Base DC that scales with enemy mil and your prep outcome */
<<set _baseDC = 9>>
<<set _prep = Number($raidPrepMod ?? 0)>>
/* IMPORTANT: prep is GOOD when positive -> it should LOWER DC */
<<set _dc = Math.floor(_baseDC + (_enemyMil * 1.0) - (_ourMil * 0.7) - _prep)>>
/* clamp */
<<set _dc = Math.max(6, Math.min(18, _dc))>>
/* store both standardized + legacy vars */
<<set $raidCtx.combatDC = _dc>>
<<set $raidCombatDC = _dc>>
/* log for UI/debug */
<<set $raidCtx.log.combat = {
dc:_dc,
baseDC:_baseDC,
enemyMil:_enemyMil,
ourMil:_ourMil,
prep:_prep
}>>
<</if>>
<</silently>>
''<div class="hub-textbox">
Arrows fly. Spears meet flesh.
<br><br>
The camp erupts into chaos—too close, too loud, too fast. You can’t track the whole fight. You can only track the enemy directly in front of you.
<br><br>
The air thickens with the coppery stink of blood and the harsh, ripping sounds men make when they realize they’re dying.
<br><br>
A choice has to be made. Right now.
<br><br>
In the end, you…
<<if $debug>>
<div class="muted" style="margin-top:10px;">
(Testing DC: <<print $raidCtx.log.combat.dc>>; Enemy MilStr: <<print $raidCtx.log.combat.enemyMil>>; YourMil: <<print $raidCtx.log.combat.ourMil>>; PrepMod: <<print $raidCtx.log.combat.prep>>)
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Muscle through (Strength + Endurance)</span>" "Raid_Party_CombatResolve">>
<<set $raidCombatChoice = "brawl">>
<<set $raidCtx.combatChoice = "brawl">>
<</link>>
<<link "<span class='choice-num'>2</span><span class='choice-text'>Lead with tactics (Leadership + Wisdom)</span>" "Raid_Party_CombatResolve">>
<<set $raidCombatChoice = "tactics">>
<<set $raidCtx.combatChoice = "tactics">>
<</link>>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = $raidCtx.log ?? {}>>
/* Apply once (prevents rerolls + double penalties if revisited) */
<<if !$raidCtx.combatDone or !$raidCtx.log.combat>>
<<set $raidCtx.combatDone = true>>
<<set _roll = random(1, 20)>>
/* Use standardized combat DC (fallbacks for safety) */
<<set _dc = Number($raidCtx.combatDC ?? ($raidCombatDC ?? 10))>>
/* Tribe military bonus (scaled) */
<<set _mil = Math.floor(Number($playerMilStr ?? 0) / 5)>>
/* Choice (prefer standardized, fallback to legacy) */
<<set _choice = $raidCtx.combatChoice ?? ($raidCombatChoice ?? "brawl")>>
<<set _a = 0>>
<<set _b = 0>>
<<set _label = "">>
<<if _choice is "brawl">>
<<set _a = Number($strength ?? 0)>>
<<set _b = Number($endurance ?? 0)>>
<<set _label = "Strength + Endurance">>
<<else>>
<<set _a = Number($leadership ?? 0)>>
<<set _b = Number($wisdom ?? 0)>>
<<set _label = "Leadership + Wisdom">>
<</if>>
<<set _total = _a + _b + _mil + _roll>>
<<set _ok = _total >= _dc>>
/* Casualties (always apply; smaller on success) */
<<set _baseCas = _ok ? 1 : 3>>
<<set _cas = Math.max(0, _baseCas + Number($raidCasualtyMod ?? 0))>>
<<set _cas = Math.min(_cas, Number($pops ?? 0))>>
<<set $pops = Math.max(0, Number($pops ?? 0) - _cas)>>
<<set $raidCasualties = _cas>>
/* Outcome + penalties */
<<if _ok>>
<<set $raidOutcome = "success">>
<<set _zealLoss = 0>>
<<set _stabLoss = 0>>
<<else>>
<<set $raidOutcome = "fail">>
<<set _zealLoss = 12>>
<<set _stabLoss = 6>>
<<set $zeal = Number($zeal ?? 0) - _zealLoss>>
<<set $stability = Number($stability ?? 0) - _stabLoss>>
<</if>>
/* Log */
<<set $raidCtx.log.combat = {
choice:_choice,
dc:_dc, roll:_roll,
label:_label,
a:_a, b:_b, mil:_mil,
total:_total,
ok:_ok,
baseCas:_baseCas,
cas:_cas,
zealLoss:_zealLoss,
stabLoss:_stabLoss
}>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<div class="result-list">
<<if $raidCtx.log.combat.ok>>
<div class="result-line good">
<span class="label">Combat</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Combat</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print $raidCtx.log.combat.label>> + d20 vs DC</span>
<<set _combatLine =
String($raidCtx.log.combat.total) +
($debug ? (" / " + $raidCtx.log.combat.dc) : "") +
" (Mil +" + $raidCtx.log.combat.mil + ")"
>>
<span class="value"><<print _combatLine>></span>
</div>
</div>
<br><br>
<<if $raidCtx.log.combat.choice is "brawl">>
You go in close.
<br><br>
You become a living battering ram—your shoulder finding the first defender’s chest with a wet thud that sends him tumbling back into his own ranks.
<br><br>
You don’t stop. You are the breach point, and your people follow in the violent wake you leave behind—steel and bodies pouring through the gap you carve.
<br><br>
<<if $raidCtx.log.combat.ok>>
They cannot stop you. Their line is loose earth before a landslide—buckling, then shattering into scattered, terrified knots of resistance.
<br><br>
Your warriors flood the openings you make, spears turning panic into a butcher’s tally. The camp’s last semblance of order collapses into pure, unadulterated chaos.
<<else>>
Your momentum breaks against a wall of spears you thought you’d splinter.
<br><br>
You surge ahead—alone—then whirl, expecting your warriors at your back… and see only a shrinking knot of them being forced down and back.
<br><br>
The battle-lust in your veins turns to ice. A shallow cut across your ribs registers for the first time—pain you never felt when you were moving forward.
<br><br>
There is no forward now. Only retreat. The raid is a failure.
<</if>>
<<else>>
You hold back from the front—a calm eye in the center of the storm.
<br><br>
Your hands are the only weapons you need. A sharp gesture sends two men right. A hooked finger pulls another pair around the fire to cut off runners.
<br><br>
You are not a warrior in this moment—you are a conductor of violence, turning raw panic into a focused blade.
<br><br>
<<if $raidCtx.log.combat.ok>>
They don’t see it coming. They fixate on the chaos at the front and fail to notice the knife you’ve slipped into their back.
<br><br>
By the time they realize they’re being split and isolated, their camp has become a maze of their own making—every tent a blind corner, every shadow a hiding place.
<br><br>
The moment of battle passes. This becomes something colder.
<br><br>
A slaughter.
<<else>>
The plan collides with chaos. Smoke chokes the air. Signals vanish in a storm of shouting and motion.
<br><br>
You watch, tight-jawed, as men misread a gesture and charge the wrong target—momentum wasted, the opening missed.
<br><br>
The defenders catch the rhythm of your failure and press hard. The fight dissolves into ugly, desperate exchanges—too often ending in your blood, not theirs.
<</if>>
<</if>>
<br><br>
<<if $raidCtx.log.combat.ok>>
Their line breaks like a dam. The camp floods with panic, the battle dissolving into a rout.
<<else>>
Your push stalls. In that single heartbeat of hesitation, their fear ignites into fury.
<br><br>
They aren’t the ones on the defensive anymore.
<</if>>
<br><br>
<div class="result-list">
<div class="result-line bad">
<span class="label">Casualties</span>
<span class="value"><<print $raidCtx.log.combat.cas>></span>
</div>
<<if !$raidCtx.log.combat.ok>>
<div class="result-line bad">
<span class="label">Zeal</span>
<span class="value">-<<print $raidCtx.log.combat.zealLoss>></span>
</div>
<div class="result-line bad">
<span class="label">Stability</span>
<span class="value">-<<print $raidCtx.log.combat.stabLoss>></span>
</div>
<</if>>
</div>
</div>''
<div class="hub-buttons">
<<if $raidCtx.log.combat.ok>>
<<link "<span class='choice-num'>1</span><span class='choice-text'>Press deeper into the camp</span>" "Raid_Party_Loot">><</link>>
<<else>>
<<link "<span class='choice-num'>1</span><span class='choice-text'>Retreat</span>" "Tribe_Info">><</link>>
<</if>>
</div><<silently>>
<<run setup.playBattle()>>
<<if Number($energy ?? 0) < 2>>
<<set $raidMsg = "<span style='color:#f66'><b>Not enough Action Points.</b></span>">>
<<goto "Tribe_Info">>
<</if>>
<<set $energy = Number($energy ?? 0) - 2>>
/* Reset raid state */
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = {}>>
<<set $raidCtx.prepDone = false>>
<<set $raidCtx.combatSetupDone = false>>
<<set $raidCtx.combatDone = false>>
<<set $raidCtx.lootDone = false>>
<<set $raidCtx.prepChoice = null>>
<<set $raidCtx.combatChoice = null>>
<<set $raidCtx.lootChoice = null>>
<<set $raidCtx.combatDC = null>>
<<set $raidPrepChoice = null>>
<<set $raidCombatChoice = null>>
<<set $raidLootChoice = null>>
<<set $raidCombatDC = null>>
<<set $raidPrepMod = 0>> /* affects main combat TN */
<<set $raidCasualtyMod = 0>> /* affects casualties */
<<set $raidLootMod = 0>> /* affects loot later */
<<set $raidOutcome = "">>
<<set $raidMsg = "">>
<</silently>>
''<div class="hub-textbox"> You gather a raiding party from your tribe.
Faces hardened, spears are checked. A grim silence falls as you move out, a promise of violence carried on the wind. Your enemies- no. Your victims will learn your might today
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Continue</span>" "Raid_Party_Prep">><</link>>
</div>
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>>''<div class="hub-textbox">
Their formation shatters.
<br><br>
They scatter—vanishing into choking smoke, into the stench of trampled earth and fresh blood.
<br><br>
The camp is still a storm around you: shouting, scrambling feet, the crack of wood and the hiss of breath through teeth.
<br><br>
But in your mind, for one clean heartbeat, there is only the question of what you do with the opening you’ve made.
<br><br>
What comes next is not about winning.
<br>
It’s about taking.
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Don’t let anything slip by (Stewardship check)</span>" "Raid_Party_LootResolve">>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidLootChoice = "search">>
<<set $raidCtx.lootChoice = "search">>
<</link>>
<<link "<span class='choice-num'>2</span><span class='choice-text'>Enjoy the spoils (Endurance check)</span>" "Raid_Party_LootResolve">>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidLootChoice = "enjoy">>
<<set $raidCtx.lootChoice = "enjoy">>
<</link>>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = $raidCtx.log ?? {}>>
/* Standardized choice (prefer raidCtx, fallback to legacy) */
<<set _choice = $raidCtx.lootChoice ?? ($raidLootChoice ?? "search")>>
/* Apply once */
<<if !$raidCtx.lootDone>>
<<set $raidCtx.lootDone = true>>
<<set $raidCtx.lootChoice = _choice>>
<<set $raidLootChoice = _choice>> /* keep legacy in sync */
<<set _roll = random(1, 20)>>
<<set _dc = 10>>
<<set _ok = true>>
<<set _statKey = "">>
<<set _statVal = 0>>
<<set _note = "">>
<<set _effect = "">>
/* BRANCH: SEARCH (Stewardship) */
<<if _choice is "search">>
<<set _dc = 10>>
<<set _statKey = "Stewardship">>
<<set _statVal = Number($stewardship ?? 0)>>
<<set _ok = (_statVal + _roll) >= _dc>>
<<if _ok>>
<<set $raidLootMod = 1>>
<<set _effect = "Loot modifier +1">>
<<set _note =
"Your will becomes their hands, your gaze their eyes. You move through the chaos like a foreman of ruin, your gestures cutting through the din. You will take everything of value. There is no mercy for what they leave behind, no patience for what they try to hide. It takes only moments to flay the camp, leaving nothing but a bleached skeleton behind.">>
<<else>>
<<set $raidLootMod = 0>>
<<set _effect = "">>
<<set _note =
"You try to direct the looting, but your voice is just another shout in the madness. The moment is lost. It becomes a frantic, ugly scramble. Warriors trip over each other in the smoke, grabbing at anything that glitters while a basket of food is overturned and trampled into the mud. Too much is buried under haste and confusion. Still, when the chaos finally subsides, your people have more than they started with. The raid was a gain, even if a bit of an inneficent one.">>
<</if>>
/* BRANCH: ENJOY (Endurance) */
<<else>>
<<set _dc = 10>>
<<set _statKey = "Endurance">>
<<set _statVal = Number($endurance ?? 0)>>
<<set _ok = (_statVal + _roll) >= _dc>>
/* Enjoy never changes loot mod */
<<set $raidLootMod = 0>>
<<set _effect = "">>
<<if _ok>>
<<set _note =
"You give a sign to your men. It isn’t long before the camp is filled with screams, moans, and sounds that are something in between. The air grows heavy, reeking of sweat, sex, and burning wood as your warriors descend upon the captives with drunken enthusiasm. The firelight casts long, jerking shadows against the trees, illuminating the chaotic orgy of conquest—furs being torn aside, limbs splayed, and the rhythmic, primal slapping of flesh.">>
<<else>>
<<set _note =
"You give the sign, and the camp answers with noise and desperate heat— a chaotic symphony of grunts and gasps as your men sate their primal urges. You take one of the captives, sheathing yourself in her with ease, but the sensation is curiously flat. The yielding of mortal flesh offers no resistance, no challenge worthy of you. It is too easy, too mundane. You stop, not because your muscles ache or your breath hitches—you could go for days—but because the thrill dies, suffocated by the sheer boredom of common conquest. The fire of desire within you isn't extinguished by exhaustion, but by disinterest.">>
<</if>>
<</if>>
<<set _total = _statVal + _roll>>
/* Log */
<<set $raidCtx.log.loot = {
choice:_choice,
dc:_dc, roll:_roll,
statKey:_statKey, statVal:_statVal,
total:_total,
ok: !!_ok,
lootMod:Number($raidLootMod ?? 0),
effect:_effect,
note:_note
}>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<silently>>
/* one-string roll line */
<<set _lootLine =
String($raidCtx.log.loot.total) + " / " + $raidCtx.log.loot.dc
>>
/* temp success flag */
<<set _enjoyPassed = ($raidCtx.log.loot.choice is "enjoy") and !!$raidCtx.log.loot.ok>>
/* NEW: pick 1 of 4 enjoy images (equal odds) */
<<set _enjoyImgRoll = random(1,4)>>
<<set _enjoyImg = "images/events/Raid/SpoilsParty.gif">> /* default */
<<if _enjoyImgRoll is 1>>
<<set _enjoyImg = "images/events/Raid/SpoilsParty_01.gif">>
<<elseif _enjoyImgRoll is 2>>
<<set _enjoyImg = "images/events/Raid/SpoilsParty_02.gif">>
<<elseif _enjoyImgRoll is 3>>
<<set _enjoyImg = "images/events/Raid/SpoilsParty_03.gif">>
<<else>>
<<set _enjoyImg = "images/events/Raid/SpoilsParty.gif">>
<</if>>
<</silently>>
<!-- SEARCH: STAT CHECK FIRST (nothing above it) -->
<<if $raidCtx.log.loot.choice is "search">>
<div class="result-list">
<<if $raidCtx.log.loot.ok>>
<div class="result-line good">
<span class="label"><<print $raidCtx.log.loot.statKey>> check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label"><<print $raidCtx.log.loot.statKey>> check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print $raidCtx.log.loot.statKey>> + d20 vs DC</span>
<span class="value"><<print _lootLine>></span>
</div>
<<if $raidCtx.log.loot.effect>>
<div class="result-line good">
<span class="label">Effect</span>
<span class="value"><<print $raidCtx.log.loot.effect>></span>
</div>
<</if>>
</div>
<<print $raidCtx.log.loot.note>>
You breathe in, steadying yourself amid the aftermath—surprisingly calm.
<</if>>
<!-- ENJOY: Intro -> IMG (random 1 of 4) -> STAT CHECK -> (optional 2nd IMG on success) -> Post text -->
<<if $raidCtx.log.loot.choice is "enjoy">>
<<print $raidCtx.log.loot.note>>
<br><br>
<<nsfwimg _enjoyImg>>
<div class="result-list">
<<if $raidCtx.log.loot.ok>>
<div class="result-line good">
<span class="label"><<print $raidCtx.log.loot.statKey>> check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label"><<print $raidCtx.log.loot.statKey>> check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print $raidCtx.log.loot.statKey>> + d20 vs DC</span>
<span class="value"><<print _lootLine>></span>
</div>
</div>
<<if _enjoyPassed>>
<br><br>
<<nsfwimg "images/events/Raid/SpoilsPartyWin.gif">>
<</if>>
<<if _enjoyPassed>>
While your warriors are fierce, they are merely human. One by one, they roll off their prizes, chests heaving and eyes glazed, some drifting into a sated, snoring sleep as their stamina fails them.
You, however, are built of harder stuff. Your stamina is a fearsome legend in the making, allowing you to plow through woman after woman long after the fires have burned low.
They are left gasping and trembling, utterly ruined and conquered by your relentless pace and formidable size, while you remain hard and ready, a towering monument of virility amidst a camp of exhausted mortals.
<<else>>
The moment burns out early.
<</if>>
You breathe in, steadying yourself amid the aftermath—surprisingly calm.
<</if>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Take what you can and leave</span>" "Raid_Party_Resolve">><</link>>
</div>''<div class="hub-textbox">
You close in on the outskirts. Before steel meets flesh, you make a choice.
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Give an inspiring war cry (Charisma check)</span>" "Raid_Party_PrepResolve">>
<<set $raidPrepChoice = "cry">>
<</link>>
<<link "<span class='choice-num'>2</span><span class='choice-text'>Prepare an ambush (Leadership check)</span>" "Raid_Party_PrepResolve">>
<<set $raidPrepChoice = "ambush">>
<</link>>
<<link "<span class='choice-num'>3</span><span class='choice-text'>Rush straight on (no check)</span>" "Raid_Party_PrepResolve">>
<<set $raidPrepChoice = "rush">>
<</link>>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = $raidCtx.log ?? {}>>
/* Map legacy choice -> unified choice keys */
<<set _choice = $raidCtx.prepChoice ?? (
($raidPrepChoice is "cry") ? "charisma" :
(($raidPrepChoice is "ambush") ? "leadership" : "base")
)>>
/* DC by approach */
<<set _dc = 10>>
<<if _choice is "leadership">>
<<set _dc = 8>>
<</if>>
/* Only roll when a check is actually happening */
<<set _roll = 0>>
<<if _choice is "charisma" or _choice is "leadership">>
<<set _roll = random(1, 20)>>
<</if>>
/* Apply once */
<<if !$raidCtx.prepDone>>
<<set $raidCtx.prepDone = true>>
<<set $raidCtx.prepChoice = _choice>>
<<set _ok = true>>
<<set _statKey = null>>
<<set _statVal = 0>>
<<set _note = "">>
<<set _prepDelta = 0>>
<<set _casDelta = 0>>
<<if _choice is "charisma">>
<<set _statKey = "Charisma">>
<<set _statVal = Number($charisma ?? 0)>>
<<set _ok = (_statVal + _roll) >= _dc>>
<<if _ok>>
<<set _prepDelta = +1>>
<<set _casDelta = -1>>
<<set _note =
"You don’t think. You just let it out." +
"<br><br>" +
"A raw, ugly shout that rips through the line—close enough to feel in the ribs. Heads snap toward you. Hands tighten. Fear doesn’t vanish, but it stops wandering." +
"<br><br>" +
"The nearest warriors answer first, then the sound rolls outward in a rough wave. Not across miles—just camp-length, from fire to fire, until the line behind you is one thing again." +
"<br><br>" +
"<b>Success:</b> the pack tightens (Prep +1, Casualties -1).">>
<<else>>
<<set _prepDelta = -1>>
<<set _casDelta = +2>>
<<set _note =
"You scream for unity." +
"<br><br>" +
"It comes out wrong—too sharp, too sudden. A few answer late. A few don’t answer at all. In the half-breath that follows, you feel the line hesitate." +
"<br><br>" +
"Not panic. Worse: uncertainty." +
"<br><br>" +
"<b>Fail:</b> the rhythm breaks (Prep -1, Casualties +2).">>
<</if>>
<<elseif _choice is "leadership">>
<<set _statKey = "Leadership">>
<<set _statVal = Number($leadership ?? 0)>>
<<set _ok = (_statVal + _roll) >= _dc>>
<<if _ok>>
<<set _prepDelta = +2>>
<<set _casDelta = -3>>
<<set _note =
"You lift a hand and the front line stills—right there, within a few strides." +
"<br><br>" +
"No speech. Just signals they already know: two fingers to the left flank, a tight fist for silence, a quick chop downward for ‘hold’." +
"<br><br>" +
"Your warriors slide into cover inside the camp’s edge—behind huts, between trees, in the shallow dips you’ve walked past a hundred times. The trap isn’t far. It’s immediate." +
"<br><br>" +
"When the first raider pushes into the light, your people are already in position." +
"<br><br>" +
"<b>Success:</b> they step into your hands (Prep +2, Casualties -3).">>
<<else>>
<<set _prepDelta = -2>>
<<set _casDelta = +2>>
<<set _note =
"You signal for the ambush—clean, sharp, confident." +
"<br><br>" +
"Then the ground betrays you. A boot skids. A pebble clicks off stone. A twig snaps—loud in the wrong moment." +
"<br><br>" +
"You see heads turn in the treeline. The raiders don’t flee, but they stop walking blind." +
"<br><br>" +
"<b>Fail:</b> the setup frays (Prep -2, Casualties +2).">>
<</if>>
<<else>>
/* Base / Rush (no roll shown) */
<<set _ok = true>>
<<set _statKey = null>>
<<set _statVal = 0>>
<<set _prepDelta = 0>>
<<set _casDelta = +2>>
<<set _note =
"Plans take time. You don’t have it." +
"<br><br>" +
"You grip your weapon and move. A hard, forward decision—feet pounding dirt, shoulders set, your tribe surging in your wake." +
"<br><br>" +
"No cleverness. Just momentum bought with blood." +
"<br><br>" +
"<b>Cost:</b> you trade blood for momentum (Prep +0, Casualties +2).">>
<</if>>
/* Apply modifiers */
<<set $raidPrepMod = Number($raidPrepMod ?? 0) + _prepDelta>>
<<set $raidCasualtyMod = Number($raidCasualtyMod ?? 0) + _casDelta>>
/* Log */
<<set $raidCtx.log.prep = {
choice:_choice, dc:_dc, roll:_roll,
statKey:_statKey, statVal:_statVal, ok:_ok,
prepDelta:_prepDelta, casDelta:_casDelta,
raidPrepMod:Number($raidPrepMod ?? 0),
raidCasualtyMod:Number($raidCasualtyMod ?? 0),
note:_note
}>>
<</if>>
<</silently>>
''<div class="hub-textbox">
<<print $raidCtx.log.prep.note>>
<br><br>
The air feels thinner now—like the camp is holding its breath with you.
<<if $raidCtx.log.prep.statKey>>
<br><br>
<<set _total = $raidCtx.log.prep.statVal + $raidCtx.log.prep.roll>>
<div class="result-list">
<<if $raidCtx.log.prep.ok>>
<div class="result-line good">
<span class="label"><<print $raidCtx.log.prep.statKey>> check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label"><<print $raidCtx.log.prep.statKey>> check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print $raidCtx.log.prep.statKey>> + d20 vs DC</span>
<span class="value"><<print _total>> / <<print $raidCtx.log.prep.dc>></span>
</div>
</div>
<</if>>
<br><br>
<div class="result-list">
<div class="result-line">
<span class="label">Prep modifier (this raid)</span>
<span class="value"><<print ($raidCtx.log.prep.raidPrepMod >= 0 ? "+" : "") + $raidCtx.log.prep.raidPrepMod>></span>
</div>
<div class="result-line">
<span class="label">Casualties modifier (this raid)</span>
<span class="value"><<print ($raidCtx.log.prep.raidCasualtyMod >= 0 ? "+" : "") + $raidCtx.log.prep.raidCasualtyMod>></span>
</div>
</div>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>The fighting begins</span>" "Raid_Party_Combat">><</link>>
</div><<silently>>
/* Resolve against the ACTUAL raided tribe (use $raidTargetId) */
<<set _tid = String($raidTargetId ?? $activeTribeId ?? "")>>
<<set _t = (setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
/* Fallback (should rarely happen) */
<<if !_t and (setup.tribes && setup.tribes.getActiveTribe)>>
<<set _t = setup.tribes.getActiveTribe()>>
<<set _tid = String(_t?.id ?? _tid)>>
<</if>>
/* Current stocks */
<<set _enemyPops = Math.max(0, Number(_t?.stats?.population ?? 0))>>
<<set _enemyRes = Math.max(0, Number(_t?.stats?.resources ?? 0))>>
/*
Base loot (testing): - steal 1 pop (if any) - steal 2..5 resources scaled by lootMod
*/
<<set _basePopTake = (_enemyPops > 0 ? 1 : 0)>>
<<set _popRate = Number($raidPopTakeRateParty ?? 0.22)>>
<<set _bonusPops = Math.ceil(_enemyPops * _popRate)>>
<<set _stealPops = Math.min(_enemyPops, _basePopTake + _bonusPops)>>
<<set _stealRes = Math.min(_enemyRes, 2 + random(0,3) + (Number($raidLootMod ?? 0) ? 2 : 0))>>
/* Apply to player */
<<set $pops = Number($pops ?? 0) + _stealPops>>
<<set $resources = Number($resources ?? 0) + _stealRes>>
/* Stability hit for swelling population (only after threshold; goods raise threshold) */
<<set $stability = Number($stability ?? 0)>>
<<if _stealPops > 0>>
<<set _popsAfter = Number($pops ?? 0)>>
<<set _goodsNow = Number($goods ?? 0)>>
<<set _baseThr = Number($raidStabBasePopThreshold ?? 30)>>
<<set _gBoost = Number($raidStabGoodsBoost ?? 0.5)>>
<<set _effThr = Math.floor(_baseThr + (_goodsNow * _gBoost))>>
<<set _excess = Math.max(0, _popsAfter - _effThr)>>
<<set _penFactor = Number($raidStabPenaltyPerExcessPop ?? 0.2)>>
<<set _penCap = Number($raidStabPenaltyCap ?? 8)>>
<<set _stabHit = Math.min(_penCap, Math.ceil(_excess * _penFactor))>>
<<if _stabHit > 0>>
<<set $stability = Number($stability ?? 0) - _stabHit>>
<</if>>
<<set $lastRaidStabilityHit = _stabHit>>
<</if>>
/* Apply to tribe (only if we actually have a tribe object) */
<<if _t>>
<<set _t.stats.population = Math.max(0, _enemyPops - _stealPops)>>
<<set _t.stats.resources = Math.max(0, _enemyRes - _stealRes)>>
/* Optional: relations drop after raiding */
<<set _t.relations = Number(_t.relations ?? 0) - 10>>
/* IMPORTANT: refresh derived stats (milStr, etc.) after edits */
<<run if (setup.tribes && setup.tribes.recalcDerived) setup.tribes.recalcDerived(_t);>>
/* Destroy THIS tribe if it collapses */
<<set _collapse = Number($tribeCollapsePopThreshold ?? 0)>>
<<if Number(_t.stats.population ?? 0) <= _collapse>>
<<destroyTribe _tid>>
<</if>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You withdraw before they can regroup.
<br><br>
<b>Raid report</b>
<div class="result-list">
<div class="result-line good">
<span class="label">Population taken</span>
<span class="value"><<print _stealPops>></span>
</div>
<div class="result-line good">
<span class="label">Resources taken</span>
<span class="value"><<print _stealRes>></span>
</div>
<<if Number($lastRaidStabilityHit ?? 0) > 0>>
<div class="result-line bad">
<span class="label">Stability</span>
<span class="value">-<<print $lastRaidStabilityHit>></span>
</div>
<</if>>
<div class="result-line bad">
<span class="label">Casualties</span>
<span class="value"><<print ($raidCasualties ?? 0)>></span>
</div>
<<if _t>>
<div class="result-line bad">
<span class="label">Relations</span>
<span class="value">-10</span>
</div>
<</if>>
</div>
<<run setup.map.fleeNpcCampAfterRaid($raidTargetId)>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Return</span>">>
<<run setup.stopBattle ? setup.stopBattle() : SimpleAudio.select("Battle").stop()>>
<<goto "Tribe_Info">>
<</link>>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = $raidCtx.log ?? {}>>
/* Resolve target tribe */
<<set _tid = String($raidCtx.targetId ?? $raidTargetId ?? $activeTribeId ?? "")>>
<<set _t = (setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
/* Fallback to active tribe if needed */
<<if !_t and (setup.tribes && setup.tribes.getActiveTribe)>>
<<set _t = setup.tribes.getActiveTribe()>>
<<set _tid = String(_t?.id ?? _tid)>>
<</if>>
<<set _name = (_t && _t.name) ? _t.name : "the tribe">>
/* Spark (standardized; uses power cost, default 25) */
<<set _beliefNow = Number($belief ?? 0)>>
<<set _spark = setup.powerById ? setup.powerById("spark") : null>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 25) : 25)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
<<set _canSpark = _hasSpark and _beliefNow >= _sparkCost>>
<</silently>>
''<div class="hub-textbox">
You reach the outskirts of <b><<print _name>></b>. The air smells of smoke and damp earth. Fires flicker between crude huts, casting long, dancing shadows. They pace like rodents, scurrying about their business, utterly unaware that the cat is watching. But even a cat can be wounded by a group of desperate rats. How will you approach?
</div>''
<div class="hub-buttons">
<<link "1) Sneak in (Wisdom check)" "Raid_Solo_ApproachResolve">>
<<set $raidSoloEntry = "sneak">>
<<set $raidCtx.solo = $raidCtx.solo ?? {}>>
<<set $raidCtx.solo.entry = "sneak">>
<</link>>
<<link "2) Casually walk in (Strength + Charisma)" "Raid_Solo_ApproachResolve">>
<<set $raidSoloEntry = "walk">>
<<set $raidCtx.solo = $raidCtx.solo ?? {}>>
<<set $raidCtx.solo.entry = "walk">>
<</link>>
<<link "3) Rush in (Strength + Endurance) [harder]" "Raid_Solo_ApproachResolve">>
<<set $raidSoloEntry = "rush">>
<<set $raidCtx.solo = $raidCtx.solo ?? {}>>
<<set $raidCtx.solo.entry = "rush">>
<</link>>
<<if _hasSpark and _canSpark>>
<<link "4) Those huts look flamable... [Spark: <<print _sparkCost>> Belief]" "Raid_Solo_ApproachResolve">>
<<set $raidSoloEntry = "spark">>
<<set $raidCtx.solo = $raidCtx.solo ?? {}>>
<<set $raidCtx.solo.entry = "spark">>
<</link>>
<<elseif _hasSpark>>
<span class="macro-button disabled" title="Not enough Belief">
4) Those huts look flamable... [Spark: <<print _sparkCost>> Belief]
</span>
<<else>>
<span class="macro-button disabled" title="Requires Spark">
4) Those huts look flamable... [Spark: <<print _sparkCost>> Belief]
</span>
<</if>>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = $raidCtx.log ?? {}>>
<<set $raidCtx.solo = $raidCtx.solo ?? {}>>
/* Choice source (standard + legacy) */
<<set _entry = String($raidCtx.solo.entry ?? $raidSoloEntry ?? "sneak")>>
<<set $raidCtx.solo.entry = _entry>>
<<set $raidSoloEntry = _entry>>
/* Spark (standardized) */
<<set _spark = setup.powerById ? setup.powerById("spark") : null>>
<<set _sparkCost = Number(_spark ? (_spark.cost ?? 20) : 20)>>
<<set _hasSpark = !!($powersOwned && $powersOwned.spark)>>
<<set _beliefNow = Number($belief ?? 0)>>
<<set _canSpark = _hasSpark and _beliefNow >= _sparkCost>>
/* Apply once */
<<if !$raidCtx.solo.approachDone>>
<<set $raidCtx.solo.approachDone = true>>
<<set _roll = random(1, 20)>>
/* Stats (fallback 0) */
<<set _wis = Number($wisdom ?? 0)>>
<<set _str = Number($strength ?? 0)>>
<<set _cha = Number($charisma ?? 0)>>
<<set _end = Number($endurance ?? 0)>>
/* Defaults */
<<set _dc = 0>>
<<set _total = 0>>
<<set _label = "">>
<<set _statLine = "">>
<<set _ok = false>>
<<set _effect = "">>
<<set _spentBelief = 0>>
/* Compute DC and total based on entry */
<<switch _entry>>
<<case "sneak">>
<<set _label = "Sneak in">>
<<set _dc = 12 + (2 * Number($raidSoloFailStacks ?? 0))>>
/* Height modifier (requested):
-2 DC if height <= 160 +1 DC if height >= 180 +2 DC if height >= 210
*/
<<set _h = Number($height ?? 0)>>
<<if _h > 0>>
<<if _h <= 160>>
<<set _dc -= 2>>
<<elseif _h >= 210>>
<<set _dc += 2>>
<<elseif _h >= 180>>
<<set _dc += 1>>
<</if>>
<</if>>
<<set _total = _wis + _roll>>
<<set _statLine = "Wisdom (" + _wis + ") + d20 vs DC">>
<<set _ok = _total >= _dc>>
<<case "walk">>
<<set _label = "Casually walk in">>
<<set _dc = 14 + (2 * Number($raidSoloFailStacks ?? 0))>>
<<set _total = _str + _cha + _roll>>
<<set _statLine = "Strength (" + _str + ") + Charisma (" + _cha + ") + d20 vs DC">>
<<set _ok = _total >= _dc>>
<<case "rush">>
<<set _label = "Rush in">>
<<set _dc = 16 + (2 * Number($raidSoloFailStacks ?? 0))>>
<<set _total = _str + _end + _roll>>
<<set _statLine = "Strength (" + _str + ") + Endurance (" + _end + ") + d20 vs DC">>
<<set _ok = _total >= _dc>>
<<case "spark">>
<<set _label = "Spark">>
<<set _ok = _canSpark>>
<<set _dc = 0>>
<<set _total = 0>>
<<set _statLine = "Spark vs Belief">>
<<default>>
<<set _label = "Approach">>
<<set _dc = 14 + (2 * Number($raidSoloFailStacks ?? 0))>>
<<set _total = _wis + _roll>>
<<set _statLine = "Wisdom (" + _wis + ") + d20 vs DC">>
<<set _ok = _total >= _dc>>
<</switch>>
/* Apply effects */
<<if _entry is "spark">>
<<if _ok>>
<<set $belief = Number($belief ?? 0) - _sparkCost>>
<<set _spentBelief = _sparkCost>>
<<set $raidLootMod = Number($raidLootMod ?? 0) + 2>>
<<set $raidSoloWeaken = Number($raidSoloWeaken ?? 0) + 2>>
<<set $raidSoloLastFailed = false>>
<<set _effect = "Loot +2, Weaken +2">>
<<else>>
/* Fail-safe if reached without enough belief */
<<set $raidSoloLastFailed = true>>
<<set $raidSoloFailStacks = Number($raidSoloFailStacks ?? 0) + 1>>
<<set _effect = "Next checks -1">>
<</if>>
<<elseif _ok>>
<<set $raidSoloLastFailed = false>>
<<set $raidLootMod = Number($raidLootMod ?? 0) + 1>>
<<set _effect = "Loot +1">>
<<else>>
<<set $raidSoloLastFailed = true>>
<<set $raidSoloFailStacks = Number($raidSoloFailStacks ?? 0) + 1>>
<<set _effect = "Next checks harder">>
<</if>>
/* Log (standard) */
<<set $raidCtx.log.soloApproach = {
entry:_entry,
label:_label,
dc:_dc,
roll:_roll,
total:_total,
statLine:_statLine,
ok:_ok,
effect:_effect,
spentBelief:_spentBelief,
failStacks:Number($raidSoloFailStacks ?? 0),
weaken:Number($raidSoloWeaken ?? 0),
lootMod:Number($raidLootMod ?? 0),
lastFailed: !!$raidSoloLastFailed
}>>
/* Compatibility: keep raidResultHtml */
<<set $raidResultHtml = ""
+ "<div class='result-list'>
"
+ "<div class='result-line " + (_ok ? "good" : "bad") + "'>
<span class='label'>Approach</span><span class='value'>" + _label + " — " + (_ok ? "Success" : "Fail") + "</span>
</div>"
+ (
(_entry is "spark")
? ("<div class='result-line " + (_ok ? "good" : "bad") + "'>
<span class='label'>Spark</span><span class='value'>" + (_ok ? "SUCCESS" : "FAIL") + "</span>
</div>")
: ("<div class='result-line'>
<span class='label'>" + _statLine + "</span><span class='value'>" + _total + " / " + _dc + "</span>
</div>")
)
+ "<div class='result-line " + (_ok ? "good" : "bad") + "'>
<span class='label'>Effect</span><span class='value'>" + _effect + "</span>
</div>"
+ ((_spentBelief > 0) ? ("<div class='result-line bad'>
<span class='label'>Belief spent</span><span class='value'>-" + _spentBelief + "</span>
</div>") : "")
+ "
</div>"
>>
<</if>>
/* Hydrate locals from log for display on revisits */
<<set _entry = String($raidCtx.log.soloApproach?.entry ?? _entry)>>
<<set _lastFailed = !!($raidCtx.log.soloApproach?.lastFailed ?? $raidSoloLastFailed)>>
<</silently>>
''<div class="hub-textbox">
<<if _entry is "sneak">>
You still your breath and let the darkness become your cloak. You move with the shadows, a ghost at the edge of their vision. You hear the scuff of their boots, the drunken sway of their torches, and the tiny, telling pauses where they listen to the silence and mistake it for safety.
<<elseif _entry is "walk">>
You leave the cover of the trees and walk directly toward the sentries. You don't hide. You don't hurry. Your shoulders are square, your back straight, a silent challenge in every step. Your eyes meet theirs, unflinching, holding their gaze. Your hands hang loose and open at your sides, a clear statement that you need no weapon to be the most dangerous thing out here.
<<elseif _entry is "rush">>
You don't walk, you launch. The world dissolves into a blur of motion. You sprint across open gaps before a shout can be raised, cutting between tents with a speed that dares them to even try.
<<elseif _entry is "spark">>
You reach for the Spark.
<br><br>
It answers, not with a word, but with a cold pressure behind your eyes.
<br><br>
A silent, white flame blossoms on your outstretched arm. It doesn't burn; it is.
<br><br>
Without a sound, it shatters. A dozen smaller embers streak across the camp, too fast to follow, too fast to dodge. Before the first shout can be raised, half the camp is blooming with impossible fire.
<</if>>
<br><br>
@@.muted;Your outcome:@@
<br>
<<print $raidResultHtml>>
<br><br>
<<print (_lastFailed
? "A misstep. A costly error. For anyone else, it would be the end. For you, it is a setback. But you feel the weight of it, a warning that even you can only stumble so many times."
: "The result feels inevitable. They were unprepared. You were not. And you will make them pay dearly for that mistake."
)>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Continue</span>" "Raid_Solo_PenaltyCheck">><</link>>
</div><<silently>>
<<set _tid = String($raidTargetId ?? $activeTribeId ?? "")>>
<<set _t = (setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
/* Fallback (legacy $tribes array) */
<<if !_t and $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if String($tribes[_i].id) is _tid>>
<<set _t = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _enemyMil = 0>>
<<if _t and _t.stats and _t.stats.milStr is not null>>
<<set _enemyMil = Number(_t.stats.milStr)>>
<</if>>
<<set _weaken = Number($raidSoloWeaken ?? 0)>>
<<set _roll = random(1,20)>>
/* Base TN and scaling: solo should be tougher */
<<set _baseTN = 13>>
<<set _tn = Math.floor(_baseTN + (_enemyMil * 1.4) + Number($raidSoloMod ?? 0) + Number($raidSoloFailStacks ?? 0))>>
<<set _tn = Math.max(8, Math.min(26, _tn))>>
<<set _sum = (Number($strength ?? 0) + Number($endurance ?? 0)) - (2 * _weaken) + _roll>>
<<set _success = (_sum >= _tn)>>
/* clear weaken after applying */
<<set $raidSoloWeaken = 0>>
<</silently>>
''<div class="hub-textbox">
Shouts erupt. You are alone in their camp—surrounded, hunted, and still moving.
<<if $debug>>
<br><br>
<div class="result-list">
<div class="result-line">
<span class="label">Your roll</span>
<span class="value"><<print _sum>> vs TN <<print _tn>></span>
</div>
<<if _weaken > 0>>
<div class="result-line bad">
<span class="label">Penalty applied</span>
<span class="value">-<<print (2 * _weaken)>> total</span>
</div>
<</if>>
</div>
<!-- Debug line: keep for now, easy to remove later -->
<div class="muted" style="margin-top:10px;">
(Testing: Enemy MilStr <<print _enemyMil>> | TN <<print _tn>>)
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Crush them (Strength + Endurance)</span>" "Raid_Solo_CombatResolve">>
<<set $raidSoloCombatSum = _sum>>
<<set $raidSoloCombatTN = _tn>>
<<set $raidSoloCombatSuccess = _success>>
<</link>>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = $raidCtx.log ?? {}>>
<<set $raidCtx.solo = $raidCtx.solo ?? {}>>
/* Target tribe */
<<set _tid = String($raidTargetId ?? $activeTribeId ?? "")>>
<<set _t = (setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
/* Fallback (legacy $tribes array) */
<<if !_t and $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if String($tribes[_i].id) is _tid>>
<<set _t = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _name = (_t && _t.name) ? _t.name : "the tribe">>
/* Pull stored combat outcome (prefer raidCtx log if you later add it; fallback to legacy vars) */
<<set _sum = Number($raidCtx.log.soloCombat?.sum ?? ($raidSoloCombatSum ?? 0))>>
<<set _dc = Number($raidCtx.log.soloCombat?.dc ?? ($raidSoloCombatTN ?? 12))>> /* yes, this is effectively DC */
<<set _success = !!($raidCtx.log.soloCombat?.ok ?? $raidSoloCombatSuccess)>>
/* Apply-once: prevents double zeal / double permanent stat loss / double relations */
<<if !$raidCtx.solo.combatResolveDone>>
<<set $raidCtx.solo.combatResolveDone = true>>
<<set _zealDelta = 0>>
<<set _strDelta = 0>>
<<set _endDelta = 0>>
<<set _relDelta = 0>>
<<set _moodSet = false>>
<<if _success>>
<<set _zealDelta = +10>>
<<set $zeal = Number($zeal ?? 0) + _zealDelta>>
<<if _t>>
<<set _relDelta = -12>>
<<set _t.relations = Number(_t.relations ?? 0) + _relDelta>>
<<set _t.mood = _t.mood ?? {}>>
<<set _t.mood.state = "fearful">>
<<set _t.mood.turns = 3>>
<<set _moodSet = true>>
<</if>>
<<set $raidResultHtml = "<span style='color:#ffb'><b>Your relationship with " + _name + " sours.</b></span>">>
<<else>>
<<set _zealDelta = -6>>
<<set $zeal = Number($zeal ?? 0) + _zealDelta>>
<<set _strDelta = -1>>
<<set _endDelta = -1>>
<<set $strength = Math.max(0, Number($strength ?? 0) + _strDelta)>>
<<set $endurance = Math.max(0, Number($endurance ?? 0) + _endDelta)>>
<</if>>
/* Log so revisits show the same deltas cleanly */
<<set $raidCtx.log.soloCombatResolve = {
tid:_tid,
name:_name,
sum:_sum,
dc:_dc,
ok:_success,
zealDelta:_zealDelta,
strDelta:_strDelta,
endDelta:_endDelta,
relDelta:_relDelta,
moodSet:_moodSet
}>>
<</if>>
/* Hydrate from log for display (revisits) */
<<set _L = $raidCtx.log.soloCombatResolve ?? {}>>
<<set _sum = Number(_L.sum ?? _sum)>>
<<set _dc = Number(_L.dc ?? _dc)>>
<<set _success = !!(_L.ok ?? _success)>>
<<set _zealDelta = Number(_L.zealDelta ?? 0)>>
<<set _relDelta = Number(_L.relDelta ?? 0)>>
<<set _strDelta = Number(_L.strDelta ?? 0)>>
<<set _endDelta = Number(_L.endDelta ?? 0)>>
<</silently>>
''<div class="hub-textbox">
The camp finally commits to seeing you as what you are.
Not a shadow. Not a mistake.
A threat.
<br><br>
<!-- Party-style check layout (NO Mil bonus for solo). DC hidden unless debug. -->
<div class="result-list">
<<if _success>>
<div class="result-line good">
<span class="label">Combat</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Combat</span>
<span class="value">FAIL</span>
</div>
<</if>>
<<silently>>
<<set _combatLine =
String(_sum) +
($debug ? (" / " + _dc) : "")
>>
<</silently>>
<div class="result-line">
<span class="label">Strength + Endurance + d20</span>
<span class="value"><<print _combatLine>></span>
</div>
</div>
<br>
<<if _success>>
They come in fast—three at once—thinking numbers will solve it.
You take the first with a brutal step-in. The second catches an elbow and stumbles back into the firelight. The third hesitates—
and hesitation is a gift.
<br><br>
A shout turns into a choke. A raised weapon drops. Suddenly they are not hunting.
They are surviving.
<br><br>
They break. Not because they lack courage—because you take it from them.
<br><br>
<div class="result-list">
<div class="result-line good">
<span class="label">Zeal</span>
<span class="value">+<<print _zealDelta>></span>
</div>
<div class="result-line bad">
<span class="label">Relations</span>
<span class="value">Sours with <<print _name>></span>
</div>
</div>
<<else>>
It starts well—one down, another reeling—
and then the camp moves as one.
Feet pound. Voices stack. Someone cuts off your angle before you even see them.
<br><br>
A club cracks across your forearm. A shoulder hits you hard enough to steal breath. You try to force space—
and find only bodies.
<br><br>
You push—too deep, too long—and their numbers swallow your momentum.
<br><br>
You tear yourself free in the end, but it costs you.
Not just blood— something in the muscle, in the breath, in the way your body answers you.
<br><br>
<div class="result-list">
<div class="result-line bad">
<span class="label">Zeal</span>
<span class="value"><<print _zealDelta>></span>
</div>
<div class="result-line bad">
<span class="label">Permanent</span>
<span class="value">Strength <<print _strDelta>>, Endurance <<print _endDelta>></span>
</div>
</div>
<</if>>
</div>''
<div class="hub-buttons">
<<if _success>>
<<link "<span class='choice-num'>1</span><span class='choice-text'>Take your spoils</span>" "Raid_Solo_Loot">><</link>>
<<else>>
<<link "<span class='choice-num'>1</span><span class='choice-text'>Escape while you can</span>" "Tribe_Info">><</link>>
<</if>>
</div><<silently>>
<<run setup.playBattle()>>
<<if (Number($energy ?? 0) < 1)>>
<<set $raidMsg = "<span style='color:#f66'><b>Not enough Action Points.</b></span>">>
<<goto "Tribe_Info">>
<</if>>
<<set $energy = Number($energy ?? 0) - 1>>
/* Standard ctx init */
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = $raidCtx.log ?? {}>>
/* Reset solo raid state (standard + legacy kept in sync) */
<<set $raidTargetId = String($raidTargetId ?? $activeTribeId ?? "")>>
<<set $raidCtx.targetId = $raidTargetId>>
<<set $raidSoloMod = 0>>
<<set $raidSoloFailStacks = 0>>
<<set $raidSoloWeaken = 0>>
<<set $raidLootMod = 0>>
<<set $raidResultHtml = "">>
<<set $raidSoloLastFailed = false>>
<<set $raidCtx.solo = {
mod: 0,
failStacks: 0,
weaken: 0,
lootMod: 0,
resultHtml: "",
lastFailed: false
}>>
/* Optional: clear prior solo logs if you want clean runs */
<<set $raidCtx.log.solo = {}>>
<</silently>>
''<div class="hub-textbox">
You slip away from your camp alone, letting the forest swallow your footsteps. No allies. No chanting line of spears—just your breath and the quiet certainty of danger.
</div>
<div class="hub-buttons">
<<link "Continue" "Raid_Solo_Approach">><</link>>
</div>''
<<silently>>
<<set $uiUnlocks.map = false>>
<<set $uiUnlocks.quests = false>>
<<set $uiUnlocks.character = false>>
<<set $uiUnlocks.inventory = false>>
<<set $uiUnlocks.relationships = false>>
<</silently>>''<div class="hub-textbox">
They scatter. Smoke, screams, and the smell of churned earth.
<br>
You have a moment to decide what course of action youll take.
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Don't let anything slip by (Stewardship check)</span>" "Raid_Solo_LootResolve">>
<<set $raidLootChoice = "search">>
<</link>>
<<link "<span class='choice-num'>2</span><span class='choice-text'>Enjoy the spoils (Endurance check)</span>" "Raid_Solo_LootResolve">>
<<set $raidLootChoice = "enjoy">>
<</link>>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = $raidCtx.log ?? {}>>
/* Standardized choice (prefer raidCtx, fallback to legacy) */
<<set _choice = $raidCtx.lootChoice ?? ($raidLootChoice ?? "search")>>
/* Apply once (prevents rerolls + double loot) */
<<if !$raidCtx.lootDone>>
<<set $raidCtx.lootDone = true>>
<<set $raidCtx.lootChoice = _choice>>
<<set $raidLootChoice = _choice>> /* keep legacy in sync */
/* --- SOLO LOOT STEAL (kept from your solo version) --- */
<<set _tid = String($raidTargetId ?? $activeTribeId ?? "")>>
<<set _t = (setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
/* Fallback (legacy $tribes array) */
<<if !_t and $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if String($tribes[_i].id) is _tid>>
<<set _t = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
/* stocks */
<<set _enemyPops = 0>>
<<set _enemyRes = 0>>
<<if _t and _t.stats>>
<<set _enemyPops = Math.max(0, Number(_t.stats.population ?? 0))>>
<<set _enemyRes = Math.max(0, Number(_t.stats.resources ?? 0))>>
<</if>>
/* --- ROLL + CHECK (mirrors group structure) --- */
<<set _roll = random(1, 20)>>
<<set _dc = 10>>
<<set _ok = true>>
<<set _statKey = "">>
<<set _statVal = 0>>
<<set _note = "">>
<<set _outcome = "">>
<<set _effect = "">>
/* BRANCH: SEARCH (Stewardship) */
<<if _choice is "search">>
<<set _dc = 10>>
<<set _statKey = "Stewardship">>
<<set _statVal = Number($stewardship ?? 0)>>
<<set _ok = (_statVal + _roll) >= _dc>>
<<if _ok>>
<<set $raidLootMod = 1>>
<<set _effect = "Loot modifier +1">>
<<set _note =
"You move like a thief and a quartermaster combined—nothing of value escapes your hands.">>
<<set _outcome = "" >>
<<else>>
<<set $raidLootMod = 0>>
<<set _effect = "">>
<<set _note =
"You move like a thief and a quartermaster combined—nothing of value escapes your hands." +
"<br><br>" +
"Still, haste blunts your edge. Too much is lost in the scramble.">>
<<set _outcome = "" >>
<</if>>
/* BRANCH: ENJOY (Endurance) */
<<else>>
<<set _dc = 10>>
<<set _statKey = "Endurance">>
<<set _statVal = Number($endurance ?? 0)>>
<<set _ok = (_statVal + _roll) >= _dc>>
/* Enjoy never changes loot mod */
<<set $raidLootMod = 0>>
<<set _effect = "">>
/* Your solo enjoy text stays solo-themed */
<<set _note =
"What awaits you is a buffet of trembling female bodies, ready to be devoured by their new chieftain." +
"<br>" +
"And this whole ordeal has left you quite peckish.">>
<<set _outcome = "" >>
<</if>>
<<set _total = _statVal + _roll>>
/* --- APPLY SOLO STEAL (after loot mod decided) --- */
<<set _stealPops = (_enemyPops > 0 ? 1 : 0)>>
<<set _stealRes = Math.min(_enemyRes, 3 + random(1,4) + (Number($raidLootMod ?? 0) ? 3 : 0))>>
/* apply to player */
<<set $pops = Number($pops ?? 0) + _stealPops>>
<<set $resources = Number($resources ?? 0) + _stealRes>>
/* apply to tribe */
<<if _t and _t.stats>>
<<set _t.stats.population = Math.max(0, _enemyPops - _stealPops)>>
<<set _t.stats.resources = Math.max(0, _enemyRes - _stealRes)>>
/* IMPORTANT: refresh derived stats (milStr, etc.) after edits */
<<run if (setup.tribes && setup.tribes.recalcDerived) setup.tribes.recalcDerived(_t);>>
/* Destroy THIS tribe if it collapses */
<<set _collapse = Number($tribeCollapsePopThreshold ?? 0)>>
<<if Number(_t.stats.population ?? 0) <= _collapse>>
<<destroyTribe _tid>>
<</if>>
<</if>>
/* Log (standard) */
<<set $raidCtx.log.loot = {
choice:_choice,
dc:_dc, roll:_roll,
statKey:_statKey, statVal:_statVal,
total:_total,
ok:_ok,
lootMod:Number($raidLootMod ?? 0),
effect:_effect,
note:_note,
outcome:_outcome,
stealPops:_stealPops,
stealRes:_stealRes
}>>
<</if>>
/* Hydrate locals from log for revisits */
<<set _choice = $raidCtx.log.loot?.choice ?? _choice>>
<</silently>>
''<div class="hub-textbox">
<<silently>>
<<set _lootLine = String($raidCtx.log.loot.total) + " / " + $raidCtx.log.loot.dc>>
<</silently>>
<!-- SEARCH: STAT CHECK FIRST (nothing above it) -->
<<if $raidCtx.log.loot.choice is "search">>
<div class="result-list">
<<if $raidCtx.log.loot.ok>>
<div class="result-line good">
<span class="label"><<print $raidCtx.log.loot.statKey>> check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label"><<print $raidCtx.log.loot.statKey>> check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print $raidCtx.log.loot.statKey>> + d20 vs DC</span>
<span class="value"><<print _lootLine>></span>
</div>
<<if $raidCtx.log.loot.effect>>
<div class="result-line good">
<span class="label">Effect</span>
<span class="value"><<print $raidCtx.log.loot.effect>></span>
</div>
<</if>>
</div>
<<print $raidCtx.log.loot.note>>
<</if>>
<!-- ENJOY: IMG -> flavor -> STAT CHECK -> (optional outcome) -->
<<if $raidCtx.log.loot.choice is "enjoy">>
<<nsfwimg "images/events/Raid/RaidSolo.gif">>
<<print $raidCtx.log.loot.note>>
<br><br>
<div class="result-list">
<<if $raidCtx.log.loot.ok>>
<div class="result-line good">
<span class="label"><<print $raidCtx.log.loot.statKey>> check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label"><<print $raidCtx.log.loot.statKey>> check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label"><<print $raidCtx.log.loot.statKey>> + d20 vs DC</span>
<span class="value"><<print _lootLine>></span>
</div>
</div>
<<if $raidCtx.log.loot.outcome>>
<br>
<<print $raidCtx.log.loot.outcome>>
<</if>>
<</if>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Leave with what you can carry</span>" "Raid_Solo_Resolve">><</link>>
</div><<silently>>
<<set $raidCtx = $raidCtx ?? {}>>
<<set $raidCtx.log = $raidCtx.log ?? {}>>
<<set $raidCtx.solo = $raidCtx.solo ?? {}>>
/* Show penalty check only if the approach just failed */
<<set _show = !!($raidSoloLastFailed)>>
/* Apply once per entry into this passage */
<<if !$raidCtx.solo.penaltyDone>>
<<set $raidCtx.solo.penaltyDone = true>>
<<if _show>>
<<set _roll = random(1,20)>>
<<set _dc = 14 + Math.max(0, Number($raidSoloFailStacks ?? 0) - 1)>>
<<set _sum = Number($endurance ?? 0) + _roll>>
<<set _ok = (_sum >= _dc)>>
<<if !_ok>>
/* Note: keeping your original behavior exactly */
<<set $raidSoloWeaken = 1>>
<</if>>
/* Clear the flag so future nodes see we're past the mistake */
<<set $raidSoloLastFailed = false>>
/* Log for stable display on revisits */
<<set $raidCtx.log.soloPenalty = {
show:true,
roll:_roll,
dc:_dc,
sum:_sum,
ok:_ok,
weaken:Number($raidSoloWeaken ?? 0)
}>>
<<else>>
<<set $raidCtx.log.soloPenalty = { show:false }>>
<</if>>
<</if>>
/* Hydrate locals from log for display on revisits */
<<set _show = !!($raidCtx.log.soloPenalty?.show ?? _show)>>
<<set _ok = !!($raidCtx.log.soloPenalty?.ok ?? false)>>
<<set _dc = Number($raidCtx.log.soloPenalty?.dc ?? 0)>>
<<set _sum = Number($raidCtx.log.soloPenalty?.sum ?? 0)>>
<</silently>>
''<div class="hub-textbox">
<<if _show>>
You try to mitigate the error. After all what are spears or arrows againts you?
<br><br>
<div class="result-list">
<<if _ok>>
<div class="result-line good">
<span class="label">Penalty check</span>
<span class="value">SUCCESS</span>
</div>
<<else>>
<div class="result-line bad">
<span class="label">Penalty check</span>
<span class="value">FAIL</span>
</div>
<</if>>
<div class="result-line">
<span class="label">Endurance + d20 vs DC</span>
<span class="value"><<print _sum>> / <<print _dc>></span>
</div>
</div>
<br>
<<if _ok>>
You calm yourself. A spear shatters against your ribs, the impact a dull thud you barely register. An arrow scrapes your arm, a kiss of steel that fails to break the skin. You draw a breath, not of relief, but of simple, calm existence. They have thrown their worst, and you remain untouched. Unbroken.
<<else>>
For a single heartbeat, your body betrays you. You move all wrong—too stiff, then too fast, a clumsy lurch that makes you far too present. A spear takes advantage. The point bites, a shallow, hot line of fire opening up along your ribs. The shock of it sends a wave of weakness through you, and for a moment, your limbs feel like lead. You are slower than you should be.
<br><br>
<span class="muted"><b>Temporary:</b> -1 to all stats on your next check.</span>
<</if>>
<<else>>
You breathe in, slow and controlled.
No eyes on you. No sudden torches turning.
Just the next step, and the next.
<</if>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>The real fight begins</span>" "Raid_Solo_Combat">><</link>>
</div><<silently>>
<<set _tid = String($raidTargetId ?? $activeTribeId ?? "")>>
<<set _t = (setup.tribes && setup.tribes.getById) ? setup.tribes.getById(_tid) : null>>
/* Fallback (legacy $tribes array) */
<<if !_t and $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if String($tribes[_i].id) is _tid>>
<<set _t = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
/* stocks */
<<set _enemyPops = 0>>
<<set _enemyRes = 0>>
<<if _t and _t.stats>>
<<set _enemyPops = Math.max(0, Number(_t.stats.population ?? 0))>>
<<set _enemyRes = Math.max(0, Number(_t.stats.resources ?? 0))>>
<</if>>
/* Solo success loot is bigger than party (riskier) */
<<set _basePopTake = (_enemyPops > 0 ? 1 : 0)>>
<<set _popRate = Number($raidPopTakeRateSolo ?? 0.28)>>
<<set _bonusPops = Math.ceil(_enemyPops * _popRate)>>
<<set _stealPops = Math.min(_enemyPops, _basePopTake + _bonusPops)>>
/* resources: 18% + small random, slightly better than party */
<<set _stealRes = Math.min(_enemyRes, Math.ceil(_enemyRes * 0.18) + random(1,4))>>
/* Apply loot */
<<if _t and _t.stats>>
<<set _t.stats.population = Math.max(0, _enemyPops - _stealPops)>>
<<set _t.stats.resources = Math.max(0, _enemyRes - _stealRes)>>
<</if>>
/* Add to player */
<<set $pops = Number($pops ?? 0) + _stealPops>>
<<set $goods = Number($goods ?? 0) + _stealRes>>
/* Scaled stability hit (only if you actually gained pop) */
<<set $lastRaidStabilityHit = 0>>
<<if _stealPops > 0>>
<<set _baseThresh = Number($raidStabBasePopThreshold ?? 30)>>
<<set _goodsBoost = Number($raidStabGoodsBoost ?? 0.5)>>
<<set _effThresh = _baseThresh + Math.floor(Number($goods ?? 0) * _goodsBoost)>>
<<set _afterPops = Number($pops ?? 0)>>
<<if _afterPops > _effThresh>>
<<set _penPer = Number($raidStabPenaltyPerExcessPop ?? 0.2)>>
<<set _cap = Number($raidStabPenaltyCap ?? 8)>>
<<set _excess = _afterPops - _effThresh>>
<<set _hit = Math.ceil(_excess * _penPer)>>
<<set _hit = Math.min(_hit, _cap)>>
<<set $stability = Math.max(0, Number($stability ?? 0) - _hit)>>
<<set $lastRaidStabilityHit = _hit>>
<</if>>
<</if>>
/* Recalc derived stats so milStr/UI updates immediately */
<<if _t and setup.tribes and setup.tribes.recalcDerived>>
<<run setup.tribes.recalcDerived(_t)>>
<</if>>
/* Collapse/destroy threshold */
<<set _collapse = Number($tribeCollapsePopThreshold ?? 0)>>
<<if _t and Number(_t.stats.population ?? 0) <= _collapse>>
<<destroyTribe _tid>>
<</if>>
<</silently>>
''<div class="hub-textbox">
You vanish into the dark before they can rally.
<br><br>
<b>Raid report</b>
<div class="result-list">
<div class="result-line good">
<span class="label">Population taken</span>
<span class="value"><<print _stealPops>></span>
</div>
<div class="result-line good">
<span class="label">Resources taken</span>
<span class="value"><<print _stealRes>></span>
</div>
<<if Number($lastRaidStabilityHit ?? 0) > 0>>
<div class="result-line bad">
<span class="label">Stability</span>
<span class="value">-<<print $lastRaidStabilityHit>></span>
</div>
<</if>>
</div>
<<if $raidResultHtml>>
<div class="muted" style="margin-top:10px;">
<<print $raidResultHtml>>
</div>
<</if>>
<<run setup.map.fleeNpcCampAfterRaid($raidTargetId)>>
</div>''
<div class="hub-buttons">
<<link "<span class='choice-num'>1</span><span class='choice-text'>Return</span>">>
<<run setup.stopBattle ? setup.stopBattle() : SimpleAudio.select("Battle").stop()>>
<<run setup.playMainTheme ? setup.playMainTheme() : null>>
<<goto "Tribe_Info">>
<</link>>
</div><div class="report-wrap report-receipt">
<<silently>>
/* Safe report object + safe sub-objects */
<<set _r = $turnReport ?? {}>>
<<set _food = _r.food ?? {}>>
<<set _pop = _r.population ?? {}>>
<<set _res = _r.resources ?? {}>>
<<set _goods = _r.goods ?? {}>>
<<set _belief = _r.belief ?? {}>>
<<set _stab = _r.stability ?? {}>>
<<set _zeal = _r.zeal ?? {}>>
/* Defensive numeric getters */
<<set _fh = Number(_food.hunting ?? 0)>>
<<set _ff = Number(_food.foraging ?? 0)>>
<<set _fn = Number(_food.needs ?? 0)>>
<<set _fo = Number(_food.other ?? 0)>>
<<set _ft = Number(_food.total ?? (Number($food ?? 0)))>>
<<set _pp = Number(_pop.procreation ?? 0)>>
<<set _pg = Number(_pop.netGrowth ?? 0)>>
<<set _pd = Number(_pop.netDecline ?? 0)>>
<<set _pdeath = Number(_pop.death ?? 0)>>
<<set _pt = Number(_pop.total ?? (Number($pops ?? 0)))>>
/* Resources: support both newer keys and legacy aliases */
<<set _rg = Number(_res.gathering ?? _res.crafting ?? 0)>>
<<set _rspent = Number(_res.spent ?? 0)>>
<<set _ro = Number(_res.other ?? 0)>>
<<set _rt = Number(_res.total ?? (Number($resources ?? 0)))>>
/* Goods */
<<set _gc = Number(_goods.crafted ?? 0)>>
<<set _gspent = Number(_goods.spent ?? 0)>>
<<set _go = Number(_goods.other ?? 0)>>
<<set _gt = Number(_goods.total ?? (Number($goods ?? 0)))>>
/* Belief */
<<set _bg = Number(_belief.gained ?? 0)>>
<<set _bo = Number(_belief.other ?? 0)>>
<<set _bt = Number(_belief.total ?? (Number($belief ?? 0)))>>
/* Stability */
<<set _stTrain = Number(_stab.training ?? 0)>>
<<set _stCouncil = Number(_stab.council ?? 0)>>
<<set _stFort = Number(_stab.fortify ?? 0)>>
<<set _stRel = Number(_stab.relocate ?? 0)>>
<<set _stOther = Number(_stab.other ?? 0)>>
<<set _stTotal = Number(_stab.total ?? (Number($stability ?? 0)))>>
/* Zeal */
<<set _zOmens = Number(_zeal.omens ?? 0)>>
<<set _zOther = Number(_zeal.other ?? 0)>>
<<set _zTotal = Number(_zeal.total ?? (Number($zeal ?? 0)))>>
/* Helpers: split positives/negatives so the table always balances */
<<set _pos = (n) => (Number(n) > 0 ? Number(n) : 0)>>
<<set _neg = (n) => (Number(n) < 0 ? Math.abs(Number(n)) : 0)>>
<<set _tone = (n) => (Number(n) > 0 ? "pos" : (Number(n) < 0 ? "neg" : "neutral"))>>
/* FOOD */
<<set _foodG = (_fh + _ff + _pos(_fo))>>
<<set _foodL = (_fn + _neg(_fo))>>
<<set _foodNet = (_foodG - _foodL)>>
<<set _foodCur = (_ft - _foodNet)>>
/* RESOURCES */
<<set _resG = (_rg + _pos(_ro))>>
<<set _resL = (_rspent + _neg(_ro))>>
<<set _resNet = (_resG - _resL)>>
<<set _resCur = (_rt - _resNet)>>
/* GOODS */
<<set _goodsG = (_gc + _pos(_go))>>
<<set _goodsL = (_gspent + _neg(_go))>>
<<set _goodsNet = (_goodsG - _goodsL)>>
<<set _goodsCur = (_gt - _goodsNet)>>
/* POPS */
<<set _popsG = (_pp + _pos(_pg))>>
<<set _popsL = (_pdeath + _pos(_pd))>>
<<set _popsNet = (_popsG - _popsL)>>
<<set _popsCur = (_pt - _popsNet)>>
/* BELIEF */
<<set _beliefG = (_bg + _pos(_bo))>>
<<set _beliefL = (_neg(_bo))>>
<<set _beliefNet = (_beliefG - _beliefL)>>
<<set _beliefCur = (_bt - _beliefNet)>>
/* STABILITY */
<<set _stabG = (_stTrain + _stCouncil + _stFort + _stRel + _pos(_stOther))>>
<<set _stabL = (_neg(_stOther))>>
<<set _stabNet = (_stabG - _stabL)>>
<<set _stabCur = (_stTotal - _stabNet)>>
/* ZEAL */
<<set _zealG = (_zOmens + _pos(_zOther))>>
<<set _zealL = (_neg(_zOther))>>
<<set _zealNet = (_zealG - _zealL)>>
<<set _zealCur = (_zTotal - _zealNet)>>
<<set _foodTone = _tone(_foodNet)>>
<<set _resTone = _tone(_resNet)>>
<<set _popsTone = _tone(_popsNet)>>
<<set _beliefTone = _tone(_beliefNet)>>
<<set _netMap = [
{ title: "Food", value: _foodNet },
{ title: "Resources", value: _resNet },
{ title: "Goods", value: _goodsNet },
{ title: "Stability", value: _stabNet },
{ title: "Zeal", value: _zealNet },
{ title: "Population", value: _popsNet },
{ title: "Belief", value: _beliefNet }
]>>
<<set _gainLeaders = _netMap.filter((entry) => entry.value > 0).sort((a, b) => b.value - a.value)>>
<<set _lossLeaders = _netMap.filter((entry) => entry.value < 0).sort((a, b) => a.value - b.value)>>
<<set _strongestGain = _gainLeaders.length ? _gainLeaders[0] : null>>
<<set _sharpestLoss = _lossLeaders.length ? _lossLeaders[0] : null>>
<<set _summaryText = "The season passed with little change, and the tribe held its ground.">>
<<if _strongestGain and _sharpestLoss>>
<<set _summaryText = "The tribe's greatest rise came in " + _strongestGain.title.toLowerCase() + ", while the hardest strain fell on " + _sharpestLoss.title.toLowerCase() + ".">>
<<elseif _strongestGain>>
<<set _summaryText = "The tribe gathered strength above all in " + _strongestGain.title.toLowerCase() + " this turn.">>
<<elseif _sharpestLoss>>
<<set _summaryText = "The season pressed hardest against your " + _sharpestLoss.title.toLowerCase() + ".">>
<</if>>
<</silently>>
<div class="report-head">
<div class="report-kicker">Season Ledger</div>
<div class="report-title">End of Turn Report</div>
<p class="report-subtitle"><<print _summaryText>></p>
</div>
<div class="report-summary-grid">
<div class="report-summary-card">
<span class="report-summary-label">Food Stores</span>
<span class="report-summary-main"><<print _ft>><small>Started at <<print _foodCur>></small></span>
<<if _foodNet > 0>><span class="report-summary-net pos">Net +<<print _foodNet>></span><<elseif _foodNet < 0>><span class="report-summary-net neg">Net <<print _foodNet>></span><<else>><span class="report-summary-net neutral">Net 0</span><</if>>
</div>
<div class="report-summary-card">
<span class="report-summary-label">Resources</span>
<span class="report-summary-main"><<print _rt>><small>Started at <<print _resCur>></small></span>
<<if _resNet > 0>><span class="report-summary-net pos">Net +<<print _resNet>></span><<elseif _resNet < 0>><span class="report-summary-net neg">Net <<print _resNet>></span><<else>><span class="report-summary-net neutral">Net 0</span><</if>>
</div>
<div class="report-summary-card">
<span class="report-summary-label">Tribe Size</span>
<span class="report-summary-main"><<print _pt>><small>Started at <<print _popsCur>></small></span>
<<if _popsNet > 0>><span class="report-summary-net pos">Net +<<print _popsNet>></span><<elseif _popsNet < 0>><span class="report-summary-net neg">Net <<print _popsNet>></span><<else>><span class="report-summary-net neutral">Net 0</span><</if>>
</div>
<div class="report-summary-card">
<span class="report-summary-label">Belief</span>
<span class="report-summary-main"><<print _bt>><small>Started at <<print _beliefCur>></small></span>
<<if _beliefNet > 0>><span class="report-summary-net pos">Net +<<print _beliefNet>></span><<elseif _beliefNet < 0>><span class="report-summary-net neg">Net <<print _beliefNet>></span><<else>><span class="report-summary-net neutral">Net 0</span><</if>>
</div>
</div>
<div class="report-ledger-shell">
<div class="report-ledger-head">
<strong>Full Ledger</strong>
<span>Current stores, gains, losses, and final totals for the turn.</span>
</div>
<div class="report-matrix-wrap">
<table class="report-matrix">
<thead>
<tr>
<th class="corner">+/-</th>
<th>Food</th>
<th>Resources</th>
<th>Goods</th>
<th>Stability</th>
<th>Zeal</th>
<th>Pops</th>
<th>Belief</th>
</tr>
</thead>
<tbody>
<tr class="current-row">
<th class="rowhdr">Current</th>
<td><<print _foodCur>></td>
<td><<print _resCur>></td>
<td><<print _goodsCur>></td>
<td><<print _stabCur>></td>
<td><<print _zealCur>></td>
<td><<print _popsCur>></td>
<td><<print _beliefCur>></td>
</tr>
<tr>
<th class="rowhdr">Gains</th>
<td class="pos">+<<print _foodG>></td>
<td class="pos">+<<print _resG>></td>
<td class="pos">+<<print _goodsG>></td>
<td class="pos">+<<print _stabG>></td>
<td class="pos">+<<print _zealG>></td>
<td class="pos">+<<print _popsG>></td>
<td class="pos">+<<print _beliefG>></td>
</tr>
<tr>
<th class="rowhdr">Losses</th>
<td class="neg">-<<print _foodL>></td>
<td class="neg">-<<print _resL>></td>
<td class="neg">-<<print _goodsL>></td>
<td class="neg">-<<print _stabL>></td>
<td class="neg">-<<print _zealL>></td>
<td class="neg">-<<print _popsL>></td>
<td class="neg">-<<print _beliefL>></td>
</tr>
<tr class="total-row">
<th class="rowhdr">Total</th>
<td><<print _ft>></td>
<td><<print _rt>></td>
<td><<print _gt>></td>
<td><<print _stTotal>></td>
<td><<print _zTotal>></td>
<td><<print _pt>></td>
<td><<print _bt>></td>
</tr>
</tbody>
</table>
</div>
</div>
</div><h2>Restart?</h2>
<p>This will restart the story from the beginning.</p>
<<link "Yes, restart">><<run Engine.restart()>><</link>>
<<return "Go Back">><div class="intro-creation intro-start-form no-click-sfx">
<<run setup.playIntro()>>
You exist in nothingness. A void without form or substance, yet here you are—conscious.
Your hair, you recall, was <<listbox "$hair" autoselect>>
<<option "Blonde">>
<<option "White">>
<<option "Brown">>
<<option "Ginger">>
<</listbox>>—a beautiful colour.
Your eyes, <<listbox "$eyes" autoselect>>
<<option "Blue">>
<<option "Red">>
<<option "Green">>
<<option "Brown">>
<</listbox>>.
You remember standing <<numberbox "$height" "175">> centimeters tall, your skin, <<listbox "$skin" autoselect>>
<<option "Pale">>
<<option "Beige">>
<<option "Olive">>
<<option "Ebony">>
<</listbox>>.
And your name is…
<<textbox "$user" "">>
<<button "CONFIRM">>
<<set $user = setup.normalizeCharacterName($user)>>
<<set $height = Math.min(280, Math.round(Number($height ?? 175) || 175))>>
<<if $user.trim() !=="" && $hair.trim() !=="" && $eyes.trim() !=="" && $skin.trim() !=="">>
<<goto "CONFIRM">>
<<else>>
<<script>>
Dialog.setup("You must remember..."); Dialog.wiki(Story.get("MustRemember").processText()); Dialog.open();
<</script>>
<</if>>
<</button>>
</div><<seasonPlanUI>>\::Sexual_Intercourse
<<silently>>
/* Resolve active person */
<<set _pid = $activePersonId ?? $selectedPersonId ?? $personSelectedId ?? $personInfoId>>
/* Find person */
<<set _p = null>>
<<if $people and $people.length and _pid>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _pid>>
<<set _p = $people[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Gender + relationship numbers */
<<set _gender = _p ? (_p.gender ?? "male") : "male">>
<<set _isFemale = (_gender is "female") or (_p and _p.isFemale is true)>>
<<if _isFemale>>
<<set _aff = Number(_p ? (_p.love ?? _p.trust ?? 0) : 0)>>
<<else>>
<<set _aff = Number(_p ? (_p.trust ?? 0) : 0)>>
<</if>>
<<set _obed = Number(_p ? (_p.obedience ?? 0) : 0)>>
<<set _rel = Math.max(_aff, _obed)>>
/* Session state: DO NOT reset on every rerender, and DO NOT reset on ended */
<<if !$sexSession or $sexSession.pid != _pid>>
<<set $sexSession = {
pid: _pid,
a1: 0,
a2: 0,
bliss1: 0,
bliss2: 0,
tier1Uses: 0,
t2Fails: 0,
t3Fails: 0,
t4Fails: 0,
t2Unlocked: false,
t3Unlocked: false,
t4Unlocked: false,
output: "",
ended: false
}>>
<</if>>
<<set _S = $sexSession>>
/* ----------------------------
RESOLUTION PHASE (RUN FIRST)
So output is visible THIS render
---------------------------- */
/* If ended already, do nothing */
<<if !_S.ended>>
/* Fail caps -> end */
<<if (_S.t2Fails >= 3 or _S.t3Fails >= 3 or _S.t4Fails >= 3)>>
<<set _S.ended = true>>
<<set _S.output = "The moment collapses under repeated missteps.">>
<<if _isFemale and _p>>
<<set _p.love = Number(_p.love ?? _p.trust ?? 0) - 2>>
<</if>>
<</if>>
/* Handle Arousal peaks. Priority: Arousal_1 peak (endurance) FIRST. */
<<set _didPeak1 = false>>
<<if !_S.ended and _S.a1 >= 20>>
<<set _dc = 12 + _S.bliss1>>
<<set _stat = Number($endurance ?? State.variables.endurance ?? 0)>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<if _total >= _dc>>
<<set _S.a1 = 0>>
<<set _S.bliss1 += 1>>
<<set _S.output =
"<div class='npc-check npc-check-ok'>Endurance check: (Endurance " + _stat + " + d20 " + _roll + ") = " + _total +
" vs DC " + _dc + ". <b>Success!</b></div>" +
"<div class='npc-answer' style='margin-top:.5rem;'>You recover and can continue.</div>">>
<<else>>
<<set _S.ended = true>>
<<set _S.output =
"<div class='npc-check npc-check-bad'>Endurance check: (Endurance " + _stat + " + d20 " + _roll + ") = " + _total +
" vs DC " + _dc + ". <b>Fail!</b></div>" +
"<div class='npc-answer' style='margin-top:.5rem;'>You can’t maintain control. It ends.</div>">>
<</if>>
<<set _didPeak1 = true>>
<</if>>
/* Arousal_2 peak -> love reward + bliss2 (ONLY if we didn't just do peak1 this render) */
<<if !_S.ended and !_didPeak1 and _S.a2 >= 20>>
<<set _S.a2 = 0>>
<<set _S.bliss2 += 1>>
<<if _isFemale and _p>>
<<set _p.love = Number(_p.love ?? _p.trust ?? 0) + 2>>
<</if>>
<<set _S.output = "Her response softens noticeably.">>
<</if>>
<</if>>
<</silently>>
<div class="hub-textbox">
<div>
<b>Arousal_Bar_1:</b> <<print _S.a1>> / 20<br>
<b>Arousal_Bar_2:</b> <<print _S.a2>> / 20<br>
<b>Bliss_1:</b> <<print _S.bliss1>><br>
<b>Bliss_2:</b> <<print _S.bliss2>>
</div>
<<if _S.output>>
<hr>
<<print _S.output>>
<</if>>
<<if _S.ended>>
<hr>
<<if _S.bliss2 >= 3>>
The interaction ends with a lingering warmth and an unspoken closeness.
<<elseif _S.bliss2 >= 1>>
The interaction ends on a quieter note—acceptance, if not tenderness.
<<else>>
The interaction ends without much softness.
<</if>>
<</if>>
</div>
<div class="hub-buttons">
<<if !_S.ended>>
<!-- TIER 1 -->
<<if _S.tier1Uses < 3>>
<<button "Simple action">>
<<silently>>
<<set _S.tier1Uses += 1>>
<<set _S.a2 += random(1,2)>>
<<set _S.output = "She shifts slightly, waiting for you to commit to something more deliberate.">>
<</silently>>
<<goto "Sexual_Intercourse">>
<</button>>
<<else>>
<span class="macro-button disabled">“Get on with it already.”</span>
<</if>>
<!-- Tier 2 -->
<<button "Escalate">>
<<silently>>
<<if _S.t2Unlocked>>
<<set _S.a1 += random(3,5)>>
<<set _S.a2 += random(1,2)>>
<<set _S.output = "She accepts the shift in pace without resistance.">>
<<elseif _rel >= 80>>
<<set _S.t2Unlocked = true>>
<<set _S.a1 += random(3,5)>>
<<set _S.a2 += random(1,2)>>
<<set _S.output = "<div class='npc-check npc-check-ok'><b>AUTO ACCEPT.</b> max(Relation/Obed) ≥ 80.</div><div class='npc-answer' style='margin-top:.5rem;'>She doesn’t hesitate.</div>">>
<<else>>
<<set _baseDC = 14>>
<<set _relMod = Math.floor(_rel / 10)>>
<<set _a2Mod = Math.floor(_S.a2 / 4)>>
<<set _dc = Math.max(5, _baseDC - _relMod + _a2Mod)>>
<<set _stat = Number($charisma ?? State.variables.charisma ?? 0)>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _dc)>>
<<if _ok>>
<<set _S.t2Unlocked = true>>
<<set _S.a1 += random(3,5)>>
<<set _S.a2 += random(1,2)>>
<<set _S.output = "<div class='npc-check npc-check-ok'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Success!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She agrees, cautiously.</div>">>
<<else>>
<<set _S.t2Fails += 1>>
<<set _S.output = "<div class='npc-check npc-check-bad'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Fail!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She refuses, expression unreadable.</div>">>
<<if _isFemale and _p>>
<<set _p.love = Number(_p.love ?? _p.trust ?? 0) - 1>>
<</if>>
<</if>>
<</if>>
<</silently>>
<<goto "Sexual_Intercourse">>
<</button>>
<!-- Tier 3 -->
<<button "Press further">>
<<silently>>
<<if _S.t3Unlocked>>
<<set _S.a1 += random(3,6)>>
<<set _S.a2 += random(2,4)>>
<<set _S.output = "Her response sharpens.">>
<<elseif _rel >= 80>>
<<set _S.t3Unlocked = true>>
<<set _S.a1 += random(3,6)>>
<<set _S.a2 += random(2,4)>>
<<set _S.output = "<div class='npc-check npc-check-ok'><b>AUTO ACCEPT.</b> max(Relation/Obed) ≥ 80.</div><div class='npc-answer' style='margin-top:.5rem;'>She gives a quick nod.</div>">>
<<else>>
<<set _baseDC = 17>>
<<set _relMod = Math.floor(_rel / 10)>>
<<set _a2Mod = Math.floor(_S.a2 / 4)>>
<<set _dc = Math.max(5, _baseDC - _relMod + _a2Mod)>>
<<set _stat = Number($charisma ?? State.variables.charisma ?? 0)>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _dc)>>
<<if _ok>>
<<set _S.t3Unlocked = true>>
<<set _S.a1 += random(3,6)>>
<<set _S.a2 += random(2,4)>>
<<set _S.output = "<div class='npc-check npc-check-ok'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Success!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She allows it—this time.</div>">>
<<else>>
<<set _S.t3Fails += 1>>
<<set _S.output = "<div class='npc-check npc-check-bad'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Fail!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She stops you, clearly unimpressed.</div>">>
<</if>>
<</if>>
<</silently>>
<<goto "Sexual_Intercourse">>
<</button>>
<!-- Tier 4 -->
<<button "Push the limit">>
<<silently>>
<<if _S.t4Unlocked>>
<<set _S.a1 += random(4,7)>>
<<set _S.a2 += random(4,7)>>
<<set _S.output = "She meets the intensity without backing away.">>
<<elseif _rel >= 80>>
<<set _S.t4Unlocked = true>>
<<set _S.a1 += random(4,7)>>
<<set _S.a2 += random(4,7)>>
<<set _S.output = "<div class='npc-check npc-check-ok'><b>AUTO ACCEPT.</b> max(Relation/Obed) ≥ 80.</div><div class='npc-answer' style='margin-top:.5rem;'>She accepts without protest.</div>">>
<<else>>
<<set _baseDC = 20>>
<<set _relMod = Math.floor(_rel / 10)>>
<<set _a2Mod = Math.floor(_S.a2 / 4)>>
<<set _dc = Math.max(5, _baseDC - _relMod + _a2Mod)>>
<<set _stat = Number($charisma ?? State.variables.charisma ?? 0)>>
<<set _roll = random(1,20)>>
<<set _total = _stat + _roll>>
<<set _ok = (_total >= _dc)>>
<<if _ok>>
<<set _S.t4Unlocked = true>>
<<set _S.a1 += random(4,7)>>
<<set _S.a2 += random(4,7)>>
<<set _S.output = "<div class='npc-check npc-check-ok'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Success!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She relents.</div>">>
<<else>>
<<set _S.t4Fails += 1>>
<<set _S.output = "<div class='npc-check npc-check-bad'>Check: (Charisma " + _stat + " + d20 " + _roll + ") = " + _total + " vs DC " + _dc + ". <b>Fail!</b></div><div class='npc-answer' style='margin-top:.5rem;'>She pulls back completely.</div>">>
<</if>>
<</if>>
<</silently>>
<<goto "Sexual_Intercourse">>
<</button>>
<!-- End interaction (player convenience) -->
<<button "End interaction">>
<<silently>>
<<set _S.ended = true>>
<<set _S.output = "You decide to stop before pushing things further.">>
<</silently>>
<<goto "Sexual_Intercourse">>
<</button>>
<<else>>
<!-- WHEN ENDED: ONLY THIS BUTTON REMAINS -->
<<button "End intercourse">>
<<set $sexSession = null>>
<<goto "Person_Info">>
<</button>>
<</if>>
</div>\:: StoryInit
/* ======================================================
CORE STATS
====================================================== */
<<set $wisdom = 0>>
<<set $height = 70>>
<<set $strength = 0>>
<<set $endurance = 0>>
<<set $leadership = 0>>
<<set $charisma = 0>>
<<set $stewardship = 0>>
<<set $belief = 6>>
/* ======================================================
POPULATION & ECONOMY
====================================================== */
<<set $pops = 1>>
<<set $settlements = 0>>
<<set $resources = 20>>
<<set $food = 91>>
<<set $goods = 2>>
<<set $playerMilStr = 0>>
<<set $defended = 0>>
/* ======================================================
STABILITY & FAITH
====================================================== */
<<set $stability = 0>>
<<set $zeal = 0>>
/* ======================================================
TURN / ENERGY SYSTEM
====================================================== */
<<set $energyMax = 2>>
<<set $energy = $energyMax>>
<<set $turn = 0>>
<<set $seasonPlanFlags = {}>>
/* ======================================================
TRIBE IDENTITY
====================================================== */
<<set $tribeName = "—">>
<<set $government = "Nomadic Group">>
/* ======================================================
UI UNLOCKS
====================================================== */
<<set $uiUnlocks = $uiUnlocks ?? {
character: false,
inventory: true,
relationships: false,
quests: false,
faith: false,
diplomacy: false,
laws: false,
map: false
} >>
<<set $debug = false>>
<<set $musicState = $musicState ?? { playing:false, track:"", source:"" }>>
<<set $mainThemeStarted = $mainThemeStarted ?? false>>
<<set $heartbeatActive = $heartbeatActive ?? false>>
/* ======================================================
MAP & PLAYER CAMP
====================================================== */
<<set $mapSize = 7>>
<<set $campX = null>>
<<set $campY = null>>
/* ======================================================
NPC CAMPS
====================================================== */
/* Camp 1 (preset) */
<<set $npcCampX = null>>
<<set $npcCampY = null>>
<<set $npcTemperament = "aggressive">>
<<set $npcTurnsSinceMove = 0>>
/* Camp 2 (preset) */
<<set $npcCamp2X = null>>
<<set $npcCamp2Y = null>>
<<set $npc2Temperament = "trader">>
<<set $npc2TurnsSinceMove = 0>>
/* Camp 3 (random on first spawn; JS rolls and stores it) */
<<set $npcCamp3X = null>>
<<set $npcCamp3Y = null>>
<<set $npc3Temperament = "random">>
<<set $npc3TurnsSinceMove = 0>>
/* ======================================================
TRIBES (canonical)
====================================================== */
<<set $tribes = $tribes ?? []>>
<<set $otherTribeData = $otherTribeData ?? {}>>
<<set $metTribeIds = $metTribeIds ?? {}>>
<<set $metTribes = $metTribes ?? []>>
<<set $revealedNpcCamps = $revealedNpcCamps ?? {}>>
<<set $scoutedNpcUntil = $scoutedNpcUntil ?? {}>>
<<set $defeatedTribes = $defeatedTribes ?? {}>>
/* ======================================================
EVENT SYSTEM
====================================================== */
<<set $currentEvent = null>>
<<set $eventQueue = []>>
<<set $eventCooldowns = {}>>
<<set $firedEvents = {}>>
/* ======================================================
POWERS & STAT TRACKING
====================================================== */
<<set $powersOwned = {}>>
<<set $statsPending = {}>>
/* ======================================================
ARTIFACTS / INVENTORY (SAVE-SAFE STATE)
====================================================== */
<<set $relics = $relics ?? { owned: [], active: {}, cooldowns: {} }>>
/* ======================================================
INVENTORY (ITEMS + EQUIPMENT) (SAVE-SAFE STATE)
====================================================== */
<<set $inv = $inv ?? {
items: {},
order: [],
equipped: { Head: null, Body: null, ArmLeft: null, ArmRight: null, Legs: null },
uidCounter: 0,
log: []
} >>
<<set $invTab = $invTab ?? "items">>
<<set $invSel = $invSel ?? null>>
/* ======================================================
CRAFTING (SAVE-SAFE STATE)
====================================================== */
<<set $craft = $craft ?? { sel: "" }>>
/* ======================================================
NPC SYSTEM
====================================================== */
<<set $campNpcs = $campNpcs ?? []>> /* array of NPC entries */
<<set $npcTalks = $npcTalks ?? {}>> /* { npcId: number } */
<<set $npcTestAdded = $npcTestAdded ?? false>>
/* ======================================================
QUEST SYSTEM
====================================================== */
<<set $quests = $quests ?? []>>
<<set $questFlags = $questFlags ?? {}>> /* prevents duplicate quests */
/*
Quest object shape:
{
id,
name,
desc,
objective,
status, // "active" | "complete" | "failed"
targetX,
targetY,
markerRevealed,
expeditionPassage
}
*/
<<set $victoryCampIds = $victoryCampIds ?? null>>
<<set $enemyTribesInitial = $enemyTribesInitial ?? null>>
<<set $enemyTribesRemaining = $enemyTribesRemaining ?? null>>
<<set $victoryEndShown = $victoryEndShown ?? false>>
/* ======================================================
CAMP CHATTER SYSTEM
====================================================== */
<<set $chatterPool = $chatterPool ?? [
{ text: "“The chieftain’s got a head like flint. Sparks every time he thinks.”", when: "always" },
{ text: "“We should ration… just in case.”", when: "low_food" },
{ text: "“No fights today. People are… calmer.”", when: "high_stability" },
{ text: "“Did you hear the drums last night? I swear something answered.”", when: "high_zeal" },
{ text: "“If this keeps up, someone’s going to run.”", when: "low_stability" }
] >>
<<set $dailyChatter = $dailyChatter ?? "—">>
<<set $chatterThresholds = {
food: { low: 2, high: 6 },
stability: { low: 3, high: 7 },
zeal: { low: 3, high: 7 }
}>>
/* ======================================================
AUDIO
====================================================== */
<<cacheaudio "intro" "sounds/TheVoid.mp3">>
<<cacheaudio "static" "sounds/static.mp3">>
<<cacheaudio "horsewalk" "sounds/HorseWalk.mp3">>
<<cacheaudio "age1" "sounds/TheFirstAge.mp3">>
<<cacheaudio "Battle" "sounds/TheHunt.mp3">>
<<cacheaudio "heartbeat" "sounds/heartbeat.mp3">>
<<cacheaudio "amputation" "sounds/amputation.mp3">>
<<cacheaudio "stars" "sounds/stars.mp3">>
<<cacheaudio "LostTime" "sounds/LostTime.mp3">>
<<cacheaudio "Caves" "sounds/Caves.mp3">>
<<cacheaudio "drip" "sounds/drip.mp3">>
<<cacheaudio "splash" "sounds/splash.mp3">>
/* ======================================================
PASSAGE DISPLAY HOOK (bind once)
====================================================== */
<<script>>
if (!setup._uiBindingsInstalled) {
setup._uiBindingsInstalled = true;
setup.syncStoryScrollShell = function () {
try {
const body = document.body;
if (!body) return;
const tags = String(body.getAttribute("data-tags") || "").toLowerCase();
const hasStoryScrollTag = /(^|\s)storyscroll(\s|$)/.test(tags);
const hasTribalScrollTags = /(^|\s)hideuiscroll(\s|$)/.test(tags) && /(^|\s)tribal(\s|$)/.test(tags);
const passage = document.querySelector("#passages > .passage:last-child");
const hasStoryShell = !!(passage && passage.querySelector(".hub-textbox, .intro-grounded"));
body.classList.toggle("story-scroll-shell", hasStoryShell && (hasStoryScrollTag || hasTribalScrollTags));
} catch (e) {}
};
$(document).off(":passagedisplay.uiBindings").on(":passagedisplay.uiBindings", function (ev) {
try {
// always update current passage title for chatter visibility
State.temporary._passTitle = (ev && ev.passage) ? ev.passage.title : "";
if (setup && typeof setup.syncStoryScrollShell === "function") {
setup.syncStoryScrollShell();
}
if (setup && typeof setup.clearNostalgiaSleepVeil === "function") {
setup.clearNostalgiaSleepVeil();
}
if (ev && ev.passage && ev.passage.title === "Event_Major_Nostalgia_5") {
if (setup && typeof setup.fadeNamedTrackVolume === "function") {
setup.fadeNamedTrackVolume("horsewalk", {
useSfxVolume: true,
fromVolume: ((setup.audio && setup.audio.getSfxVolume01) ? setup.audio.getSfxVolume01() : ((settings.masterVolume ?? 10) / 10)) * 0.42,
targetVolume: ((setup.audio && setup.audio.getSfxVolume01) ? setup.audio.getSfxVolume01() : ((settings.masterVolume ?? 10) / 10)) * 0.07,
durationMs: 7000,
easePow: 1.2
});
}
if (setup && typeof setup.playNamedTrackFadeIn === "function") {
setup.playNamedTrackFadeIn("LostTime", {
durationMs: 8000,
startRatio: 0.08,
easePow: 1.18,
source: "scene",
stopAll: false
});
}
if (setup && typeof setup.startNostalgiaSleepVeil === "function") {
setup.startNostalgiaSleepVeil({
triggerSelector: ".nostalgia-sleep-trigger",
endSelector: ".nostalgia-sleep-target"
});
}
}
if (ev && ev.passage && ev.passage.title === "Event_Major_Nostalgia_6") {
if (setup && typeof setup.stopSimpleAudioTrack === "function") {
setup.stopSimpleAudioTrack("horsewalk");
}
}
// refresh sidebar buttons + chatter visibility every passage
new Wikifier(null, "<<refreshSidebarUnlocks>><<setChatterVisibility>>");
} catch (e) {}
});
}
<</script>><div id="ui-root">
<!-- LAYERS -->
<div id="ui-border-layer"></div>
<div id="ui-bg-layer"></div>
<div id="ui-frame">
<div id="ui-grid">
<!-- MAIN CONTENT (top-left) -->
<div id="content-wrapper" class="ui-panel">
<div id="passages"></div>
<div id="floating-action"></div>
</div>
<!-- STATS / STATUS (top-right) -->
<aside id="sidebar" class="ui-panel">
<div class="sidebar-panel active" data-panel="status">
<div id="sidebar-inner">
<div class="sidebar-header">
<h2>Status</h2>
</div>
<div class="sidebar-core">
<div class="identity">
<a class="icon-slot patreon-badge" href="https://www.patreon.com/cw/KaspeliProductions" target="_blank" rel="noopener">
<span class="icon-glyph">❤</span>
</a>
<div class="identity-text">
<div>Name: <span id="ui-name"></span></div>
<div>Time: —</div>
</div>
</div>
</div>
<div class="sidebar-resource">
<span>Belief:</span>
<span class="resource-value" id="ui-belief">—</span>
</div>
<div class="sidebar-stats">
<div>Wisdom: <span id="stat-wisdom"></span></div>
<div>Strength: <span id="stat-strength"></span></div>
<div>Endurance: <span id="stat-endurance"></span></div>
<div>Leadership: <span id="stat-leadership"></span></div>
<div>Charisma: <span id="stat-charisma"></span></div>
<div>Stewardship: <span id="stat-stewardship"></span></div>
</div>
<div class="sidebar-energy">
<div class="sidebar-energy-label">Action Points</div>
<div class="sidebar-energy-icons" id="ui-energy"></div>
</div>
<div class="sidebar-chatter">
<div class="sidebar-chatter-kicker">Camp Murmurs</div>
<div class="sidebar-chatter-body" id="ui-chatter">—</div>
</div>
<div class="sidebar-image"></div>
</div>
</div>
</aside>
<!-- CIVILIZATION (bottom-left) -->
<aside id="civsidebar" class="ui-panel">
<div class="sidebar-panel active" data-panel="civ">
<div class="sidebar-header">
</div>
<!-- Split layout -->
<div class="civ-split">
<!-- LEFT: Civ dashboard -->
<div class="civ-left">
<div class="civ-left-inner">
<!-- ONE ROW: 5 uniform tiles + identity pushed right -->
<div class="civ-headrow">
<!-- Compact identity (right aligned) -->
<div class="civ-identity-compact">
<div class="icon-slot">🏕</div>
<div class="identity-text">
<div><span id="civ-name">—</span></div>
<div><span id="civ-gov">—</span></div>
<div class="civ-age-row">Age: <span id="ui-age"></span></div>
</div>
</div>
<!-- 5 uniform stat/resource tiles -->
<div class="civ-statrow">
<div class="civ-res-card" data-res="pops">
<div class="civ-res-hdr">
<span class="civ-res-name">Population</span>
<span class="civ-res-val" id="civ-pops">—</span>
</div>
<div class="civ-res-sub"></div>
</div>
<div class="civ-res-card" data-res="mil">
<div class="civ-res-hdr">
<span class="civ-res-name">Military</span>
<span class="civ-res-val" id="civ-mil">—</span>
</div>
<div class="civ-res-sub"></div>
</div>
<div class="civ-res-card" data-res="food">
<div class="civ-res-hdr">
<span class="civ-res-name">Food</span>
<span class="civ-res-val" id="civ-food"></span>
</div>
<div class="civ-res-sub">
<span class="civ-delta" id="civ-food-delta"></span>
<span class="civ-forecast" id="civ-food-forecast"></span>
</div>
</div>
<div class="civ-res-card" data-res="resources">
<div class="civ-res-hdr">
<span class="civ-res-name">Resources</span>
<span class="civ-res-val" id="civ-resources"></span>
</div>
<div class="civ-res-sub">
<span class="civ-delta" id="civ-res-delta"></span>
</div>
</div>
<div class="civ-res-card" data-res="goods">
<div class="civ-res-hdr">
<span class="civ-res-name">Goods</span>
<span class="civ-res-val" id="civ-goods"></span>
</div>
<div class="civ-res-sub">
<span class="civ-delta" id="civ-goods-delta"></span>
</div>
</div>
</div>
</div>
<!-- Effects -->
<div class="sidebar-segment sidebar-effects">
<div class="sidebar-segment-title"><span>Effects</span><span class="sidebar-effects-empty" id="civ-effects-empty">No active effects</span></div>
<div class="sidebar-effects-list" id="civ-effects">
<span id="civ-eff-fortified" class="civ-effect-badge" data-tone="positive" style="display:none; cursor:help;"><span class="eff-label">Fortified</span></span>
<span id="civ-eff-breeding" class="civ-effect-badge" data-tone="positive" style="display:none; cursor:help;"><span class="eff-label">Incentivized Growth</span></span>
<span id="civ-eff-scouted" class="civ-effect-badge" data-tone="positive" style="display:none; cursor:help;"><span class="eff-label">Scouted Surroundings</span></span>
<span id="civ-eff-training" class="civ-effect-badge" data-tone="positive" style="display:none; cursor:help;"><span class="eff-label">Trained Hunters</span></span>
<span id="civ-eff-organized" class="civ-effect-badge" data-tone="positive" style="display:none; cursor:help;"><span class="eff-label">Organized Tribe</span></span>
<span id="civ-eff-nourished" class="civ-effect-badge" data-tone="positive" style="display:none; cursor:help;"><span class="eff-label">Nourished</span></span>
<span id="civ-eff-shortmats" class="civ-effect-badge" data-tone="negative" style="display:none; cursor:help;"><span class="eff-label">Short on materials</span></span>
<span id="civ-eff-spoilprov" class="civ-effect-badge" data-tone="negative" style="display:none; cursor:help;"><span class="eff-label">Spoiled Provisions</span></span>
</div>
</div>
<!-- Scales -->
<div class="civ-scales">
<div class="civ-scale-label">
<span>Stability</span>
<span class="civ-scale-meta">
<span id="stability-value" class="civ-scale-value" data-tone="neutral">0</span>
<span id="stability-state" class="civ-scale-state" data-tone="neutral">Steady</span>
</span>
</div>
<div class="scale-bar"><div id="stability-fill" class="scale-fill"></div></div>
<div class="civ-scale-label">
<span>Zeal</span>
<span class="civ-scale-meta">
<span id="zeal-value" class="civ-scale-value" data-tone="neutral">0</span>
<span id="zeal-state" class="civ-scale-state" data-tone="neutral">Smoldering</span>
</span>
</div>
<div class="scale-bar"><div id="zeal-fill" class="scale-fill"></div></div>
</div>
</div>
</div>
<!-- RIGHT: Terrain panel (values only in details) -->
<div class="civ-right">
<div class="tile-panel">
<details>
<summary>
<div class="tile-summary-left">
<span class="tile-ico">🧭</span>
<span class="tile-summary-title">Terrain Info</span>
<span class="tile-summary-hint">click</span>
</div>
</summary>
<div class="tile-details">
<div class="sidebar-segment civ-tileinfo">
<div class="sidebar-segment-title">Camp Location</div>
<div class="tileinfo-grid">
<div class="tileinfo-row">
<div class="tileinfo-cell"><div><b>Terrain:</b></div><div><span id="civ-terrain">—</span></div></div>
<div class="tileinfo-cell"><div><b>Game:</b></div><div><span id="civ-tile-game">—</span></div></div>
</div>
<div class="tileinfo-row">
<div class="tileinfo-cell"><div><b>Raid Chance:</b></div><div><span id="civ-raid">—</span></div></div>
<div class="tileinfo-cell"><div><b>Resources:</b></div><div><span id="civ-tile-res">—</span></div></div>
</div>
</div>
</div>
</div>
</details>
</div>
</div>
</div>
<!-- /civ-split -->
</div>
</aside>
<!-- ACTIONS (bottom-right) -->
<section id="action-panel" class="ui-panel">
<div class="sidebar-actions">
<div class="action-page-nav" role="group" aria-label="Action groups">
<button class="action-page-arrow" id="action-page-prev" type="button" aria-label="Show previous action group" title="Previous action group">←</button>
<div class="action-page-status">
<span class="action-page-title">Core Actions</span>
<span class="action-page-count">1 / 2</span>
</div>
<button class="action-page-arrow" id="action-page-next" type="button" aria-label="Show next action group" title="Next action group">→</button>
</div>
<div class="action-page-deck">
<div class="action-page is-active" data-action-page="0">
<button class="feature-btn" id="btn-quests">Quests</button>
<button class="feature-btn" id="btn-relationships">Relationships</button>
<button class="feature-btn" id="btn-character">Character</button>
<button class="feature-btn" id="btn-inventory">Inventory</button>
</div>
<div class="action-page" data-action-page="1">
<button id="btn-faith" class="feature-btn" disabled>Faith</button>
<button id="btn-diplomacy" class="feature-btn" disabled>Diplomacy</button>
<button id="btn-laws" class="feature-btn" disabled>Laws</button>
<button id="btn-map" class="feature-btn" disabled>Map</button>
</div>
</div>
</div>
<footer id="bottombar">
<div id="bottom-right">
<button class="icon-button" id="btn-save" title="Save">💾</button>
<button class="icon-button" id="btn-settings" title="Settings">⚙</button>
<button class="icon-button" id="btn-help" title="Help">?</button>
</div>
</footer>
</section>
</div>
</div>
</div><<npcTalkUnified>><<silently>>
<<set $strength += 1>>
<<set $charisma += 1>>
<<set $wisdom += 1>>
<<set $endurance += 1>>
<</silently>>
<div class="intro-grounded intro-prologue-shell no-click-sfx">
<<if $temp is 0>>
To prove your value, you fight. Whatever there is to fight—a bison that must be brought down, a predator testing the camp’s edge. Your body moves with a certainty others lack, muscles remembering battles you have never fought. One truth becomes clear: you are a pillar of physical might, a weapon the tribe can rely upon when strength alone decides survival.
<div class="intro-notification good">
You feel yourself overflowing with strength...
</div>
<<elseif $temp is 1>>
To prove your value, you speak. Words flow easily, finding paths around obstacles that force cannot overcome. When tensions rise, your stories cool tempers. When fear grips the long nights, your tales of gods and heroes kindle courage. One truth becomes clear: you are a weaver of hearts and minds, a voice that shapes reality as surely as any spear.
<div class="intro-notification good">
You feel yourself overflowing with charisma...
</div>
<<elseif $temp is 2>>
To prove your value, you watch. While others focus on what is before them, you see patterns hidden beneath the surface—the wind’s quiet warnings, the tracks that promise game, the sky’s slow turning. One truth becomes clear: you are a conduit of knowledge, a bridge between the seen and the unseen.
<div class="intro-notification good">
You feel yourself overflowing with wisdom...
</div>
<<elseif $temp is 3>>
To prove your value, you endure. When winter drives others to desperation, you stand watch through frozen nights. When hunger weakens limbs, you continue to hunt and gather. When sickness spreads, you remain untouched, caring for those who fall. One truth becomes clear: you are a constant in a world that breaks others.
<div class="intro-notification good">
You feel yourself overflowing with endurance...
</div>
<</if>>
<div class="intro-divider">
</div>
The tribe begins to feel like home. Not because you were born among them—but because you choose to remain.
<br>
Time stretches forward, no longer measured in days, but in futures yet to come. Your purpose here is evolving beyond mere survival. You must:
<<set $temp = 0>>
<div class="intro-divider">
</div>
<div class="hub-buttons">
<<button "Protect them from threats both seen and unseen">>
<<set $temp = 0>>
<<set $strength += 1>>
<<set $endurance += 1>>
<<goto "TheLateYears">>
<</button>>
<<button "Join with them, weaving your blood into their lineage">>
<<set $temp = 1>>
<<set $pops += 3>>
<<set $endurance += 2>>
<<goto "TheLateYears">>
<</button>>
<<button "Guide their growth, shaping them into something greater">>
<<set $temp = 2>>
<<set $wisdom += 1>>
<<set $stewardship += 1>>
<<goto "TheLateYears">>
<</button>>
<<button "Ignite their spirits, awakening potential they did not know they possessed">>
<<set $temp = 3>>
<<set $charisma += 1>>
<<set $leadership += 1>>
<<goto "TheLateYears">>
<</button>>
</div>
</div><<silently>>
<<set $leadership += 1>>
<<set $stewardship += 1>>
<</silently>>
<div class="intro-grounded intro-prologue-shell no-click-sfx">
<<if $temp is 0>>
You become their shield. When predators stalk the camp, you stand between teeth and flesh. When rival tribes encroach, your presence alone is often enough to turn them away. You teach the warriors what you can—but you remain the wall they cannot replace.
<div class="intro-notification good">
You feel stronger...
</div>
<div class="intro-notification good">
You feel tougher...
</div>
<<elseif $temp is 1>>
You join with them in the most primal way. Your seed takes root, spreading through the tribe. Children bearing your features begin to appear—your eyes, your stature, your resilience. Your blood weaves itself into the tribe’s future.
<div class="intro-figure">
<<nsfwimg "images/events/Intro/PopSwell.gif">>
</div>
<div class="intro-notification good">
You feel yourself overflowing with endurance...
</div>
<div class="intro-notification good">
The tribe swells...
</div>
<<elseif $temp is 2>>
You bring order to chaos. Hunting parties become disciplined. Migration follows reason, not desperation. Resources are shared with intent rather than fear. The tribe transforms from survivors into a people.
<div class="intro-notification good">
You feel wiser...
</div>
<div class="intro-notification good">
Your stewardship improves...
</div>
<<elseif $temp is 3>>
You awaken something dormant. When despair settles, your words ignite resolve. You give them stories, rituals, and visions—an identity larger than hunger and cold. They begin to believe they are meant to endure.
<div class="intro-notification good">
You feel more charismatic...
</div>
<div class="intro-notification good">
People look to you for leadership...
</div>
<</if>>
<div class="intro-divider">
</div>
Years pass. Then decades.
What begins as good fortune becomes impossible to ignore. You learn faster than others. Strength endures. Wounds heal cleanly. Illness never comes.
The tribe ages.<br> You do not.
Children are born. <<if $temp is 1>>Many<<else>>Some<</if>> carry your blood. In time, those children grow old—older in face and body than you. The tribe notices.
Whispers begin. Fear gives way to reverence.
When disputes arise, your word settles them.<br> When enemies threaten, you stand at the front.<br> When survival hangs in the balance, instinct drives the tribe to follow.
<div class="intro-divider">
</div>
There is no ceremony when leadership changes hands—only the quiet understanding that it already has.
You are named chieftain.
Stories are told beside the fire, trying to explain what you are. No single answer exists yet—but belief is taking shape.
<div class="intro-divider">
</div>
The world remains vast.<br> Other tribes endure beyond the horizon.<br> Other forces may already be moving.
<<silently>>
<<set $stability = 5>>
<<set $zeal = 10>>
<</silently>>
<br><br>
And time stretches forward—measured not in years, but in [[generations]].
</div><<silently>>
<<set _tid = $activeTribeId ?? $selectedTribeId ?? $tribeSelectedId ?? $tribeInfoId>>
<<set _t = null>>
<<if $tribes and $tribes.length and _tid>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and $tribes[_i].id is _tid>>
<<set _t = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if !$tribeInfoTab>><<set $tribeInfoTab = "friendly">><</if>>
<<if _inRange is undefined>><<set _inRange = true>><</if>>
<<if _t>>
<<set _name = _t.name ?? "Unknown tribe">>
<<set _rel = Number(_t.relations ?? 0)>>
<<set _temp = _t.temperament ?? "normal">>
<<set _mood = (_t.mood && _t.mood.state) ? _t.mood.state : "none">>
<<set _desc = _t.description ?? "No description.">>
<<set _pop = Number((_t.stats && _t.stats.population) ?? (_t.population ?? 0))>>
<<set _res = Number((_t.stats && _t.stats.resources) ?? (_t.resources ?? 0))>>
<<set _mil = Number((_t.stats && _t.stats.milStr) ?? (_t.milStr ?? 0))>>
<<if String(_t.aiPackage ?? "") is "story_only">><<set _inRange = false>><</if>>
<</if>>
<</silently>>
<div class="tribeinfo-wrap tribeinfo-wrap--tribe"><div class="tribeinfo-card"><<if !_t>><div class="tribeinfo-title">TRIBE NOT FOUND</div><div class="tribeinfo-desc"><div class="k">Missing tribe:</div><div class="v"><<print _tid>></div></div><div class="tribeinfo-actions"><div class="tribeinfo-btnrow"><<button "Return">><<goto "OtherTribes">><</button>></div></div><<else>><div class="tribeinfo-title"><<print _name.toUpperCase()>></div><div class="tribeinfo-body"><div class="tribeinfo-left"><div class="tribeinfo-img">IMG</div><div class="tribeinfo-rel"><span>Relations</span><<set _relClass = (_rel >= 10) ? "rel-high" : ((_rel <= -5) ? "rel-low" : "rel-mid")>><strong class="<<print _relClass>>"><<print _rel>></strong></div></div><div class="tribeinfo-right"><div class="tribeinfo-meta"><<set _tempTip = (_temp is "trader") ? "More willing to trade; less likely to raid." : (_temp is "raider") ? "More likely to raid; trade is harder." : (_temp is "wary") ? "Cautious and slow to trust outsiders." : (_temp is "friendly") ? "Open to diplomacy and cooperation." : "A general behavioral tendency of the tribe.">><<set _moodTip = (_mood is "angry") ? "Short tempers; negotiations are harder." : (_mood is "calm") ? "Stable and receptive; diplomacy is easier." : (_mood is "fearful") ? "On edge; unpredictable reactions." : "Their current disposition this season.">><div class="tribeinfo-line"><span class="k">Temperament</span><span class="v"><<print '<span class="tribeinfo-badge" data-tip="' + _tempTip + '">' + _temp + '</span>'>></span></div><div class="tribeinfo-line"><span class="k">Mood</span><span class="v"><<print '<span class="tribeinfo-badge" data-tip="' + _moodTip + '">' + _mood + '</span>'>></span></div></div><div class="tribeinfo-desc"><div class="k">Description</div><div class="v"><<print _desc>></div></div><div class="tribeinfo-stats"><div class="tribeinfo-stat"><span class="k">Population</span><span class="v"><<print _pop>></span></div><div class="tribeinfo-stat"><span class="k">Resources</span><span class="v"><<print _res>></span></div><div class="tribeinfo-stat"><span class="k">Mil Str</span><span class="v"><<print _mil>></span></div></div></div></div><div class="tribeinfo-actions"><div class="tribeinfo-tabs"><<if !_inRange>><span class="tribeinfo-tab is-active" title="You cannot locate this tribe right now">Out of Range</span><<else>><<if $tribeInfoTab is "friendly">><span class="tribeinfo-tab is-active">Friendly</span><<link "Hostile">><<set $tribeInfoTab = "hostile">><<goto "Tribe_Info">><</link>><<else>><<link "Friendly">><<set $tribeInfoTab = "friendly">><<goto "Tribe_Info">><</link>><span class="tribeinfo-tab is-active">Hostile</span><</if>><</if>></div><div class="tribeinfo-btnrow"><<if !_inRange>><span class="macro-button disabled" title="You cannot locate this tribe right now">Visit</span><span class="macro-button disabled" title="You cannot locate this tribe right now">Trade</span><span class="macro-button disabled" title="You cannot locate this tribe right now">Raid</span><<button "Return">><<goto "OtherTribes">><</button>><<elseif $tribeInfoTab is "friendly">><span class="macro-button disabled is-wip" title="Under construction">Visit</span><<button "Trade">><<goto "Tribe_Trade">><</button>><<button "Return">><<goto "OtherTribes">><</button>><<else>><span class="macro-button disabled is-wip" title="Under construction">Force Migration</span><<button "Raid">><<set $raidTargetId = $activeTribeId>><<run Dialog.setup("Raid")>><<run Dialog.wiki("<<include \'Raid_Dialog\'>>")>><<run Dialog.open()>><</button>><<button "Return">><<goto "OtherTribes">><</button>><</if>></div></div><</if>></div></div><<silently>>
/* Init UI vars */
<<set $tradeOfferGoods = Number($tradeOfferGoods ?? 0)>>
<<set $tradeDemandRes = Number($tradeDemandRes ?? 0)>>
<<set $tradeResultHtml = $tradeResultHtml ?? "">>
/* Active tribe (guard for scratch/testing) */
<<set _t = (setup.trade && setup.trade.getActiveTribe) ? setup.trade.getActiveTribe() : null>>
/* Player cap */
<<set _maxOffer = Math.max(0, Number($goods ?? 0))>>
/*
Dynamic tribe cap (passage-side fallback)
- based on tribe resources in stock
- improved by relations
- temperament affects willingness
*/
<<set _tribeRes = Math.max(0, Number(_t?.stats?.resources ?? 0))>>
<<set _rel = Number(_t?.relations ?? 0)>>
<<set _temp = String(_t?.temperament ?? "normal")>>
/* willingness baseline */
<<set _baseFrac = 0.25>>
/* relations bonus: -50..+50 => -0.10..+0.15 */
<<set _relFrac = Math.max(-0.10, Math.min(0.15, _rel / 333.33))>>
/* temperament modifier */
<<set _tempFrac = (
_temp is "trader" ? 0.12 :
_temp is "opportunistic" ? 0.06 :
_temp is "honorable" ? 0.04 :
_temp is "cautious" ? -0.02 :
_temp is "fearful" ? -0.06 :
_temp is "aggressive" ? -0.08 :
0
)>>
/* final fraction, clamped */
<<set _frac = Math.max(0.05, Math.min(0.60, _baseFrac + _relFrac + _tempFrac))>>
/* dynamic max demand */
<<set _maxDemand = Math.floor(_tribeRes * _frac)>>
/* Always allow at least 0, never above their stock */
<<set _maxDemand = Math.max(0, Math.min(_maxDemand, _tribeRes))>>
/* Safety clamps so UI never exceeds caps */
<<set $tradeOfferGoods = Math.max(0, Math.min($tradeOfferGoods, _maxOffer))>>
<<set $tradeDemandRes = Math.max(0, Math.min($tradeDemandRes, _maxDemand))>>
<</silently>>
<div class="trade-wrap trade-card">
<div class="trade-title">TRADE</div>
<div class="trade-subtitle">WORK IN PROGRESS</div>
<<if !(setup.trade && setup.trade.getActiveTribe)>>
<div class="trade-result">
Trade system not loaded (setup.trade is missing). If you're testing in a Scratch build, open the full story export instead.
</div>
<</if>>
<div class="trade-head">
<div class="trade-head-item">OFFER</div>
<div class="trade-head-item">DEMAND</div>
</div>
<div class="trade-grid">
<div class="trade-panel">
<div class="trade-panel-title">GOODS</div>
<div class="trade-value"><<print $tradeOfferGoods>></div>
<div class="trade-stepper">
<<if $tradeOfferGoods > 0>>
<<button "-">>
<<set $tradeOfferGoods = Math.max(0, $tradeOfferGoods - 1)>>
<<goto "Tribe_Trade">>
<</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true">-</span>
<</if>>
<<if $tradeOfferGoods < _maxOffer>>
<<button "+">>
<<set $tradeOfferGoods = Math.min(_maxOffer, $tradeOfferGoods + 1)>>
<<goto "Tribe_Trade">>
<</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true">+</span>
<</if>>
</div>
<div class="trade-hint">
You have: <b><<print _maxOffer>></b> goods
</div>
</div>
<div class="trade-panel">
<div class="trade-panel-title">RESOURCES</div>
<div class="trade-value"><<print $tradeDemandRes>></div>
<div class="trade-stepper">
<<if $tradeDemandRes > 0>>
<<button "-">>
<<set $tradeDemandRes = Math.max(0, $tradeDemandRes - 1)>>
<<goto "Tribe_Trade">>
<</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true">-</span>
<</if>>
<<if $tradeDemandRes < _maxDemand>>
<<button "+">>
<<set $tradeDemandRes = Math.min(_maxDemand, $tradeDemandRes + 1)>>
<<goto "Tribe_Trade">>
<</button>>
<<else>>
<span class="macro-button disabled" aria-disabled="true">+</span>
<</if>>
</div>
<div class="trade-hint">
They will trade up to: <b><<print _maxDemand>></b> resources (this season)
</div>
</div>
</div>
<div class="trade-btnrow trade-confirm">
<<button "Confirm">>
<<if setup.trade && setup.trade.attemptTrade>>
<<set _r = setup.trade.attemptTrade($tradeOfferGoods, $tradeDemandRes)>>
<<if _r and _r.endTrade>>
<<goto "Tribe_Info">>
<<else>>
<<goto "Tribe_Trade">>
<</if>>
<<else>>
<<set $tradeResultHtml = "<i>Trade system not loaded.</i>">>
<<goto "Tribe_Trade">>
<</if>>
<</button>>
<<button "Return">><<goto "Tribe_Info">><</button>>
</div>
<<if $tradeResultHtml>>
<div class="trade-result">
<<print $tradeResultHtml>>
</div>
<</if>>
</div><div class="hub-textbox tut-textbox">
<strong>Belief, Zeal, Stability</strong><br><br>
<b>Belief</b><br> A special resource used to unlock and use Powers, and to improve your base stats on the character screen. Spending Belief lowers it, so save it for important moments.
<br><br>
<b>Zeal</b> and <b>Stability</b><br> These reflect your tribe’s spiritual drive and internal cohesion.
<ul>
<li>Events and outcomes can raise or lower them.</li>
<li><b>Stability</b> affects which events can appear and it also affects population growth.</li>
<li><b>Zeal</b> affects how much Belief you gain or lose each turn.</li>
</ul>
You’ll often see big changes after major outcomes (victory, defeat, disasters).
<br><br>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Resources">><</button>>
<<button "Next">><<tutOpen "Tut_Powers">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Welcome!</strong><br><br> Want a short guided tour before you start?
<br><br>
Quick note: you can always revisit this tutorial by pressing the <b>“?”</b> in the lower-right corner and going to the <b>Help</b> section.
</div>
<div class="hub-buttons tut-buttons">
<<button "No — straight into the game">>
<<tutStop>>
<</button>>
<<button "Yes — teach me">>
<<tutOpen "Tut_Loop">>
<</button>>
</div><div class="hub-textbox tut-textbox">
<strong>The basic loop</strong><br><br>
Each turn is a season. Your job is to keep the tribe alive, grow stronger, and respond to threats and opportunities.<br><br>
<b>In practice you’ll usually:</b>
<ol>
<li><b>Pick a Season Plan</b> (your “main focus” for the turn).</li>
<li><b>Spend Action Points (Energy)</b> on key actions</li>
<li><b>React to events</b> (trade, raids, encounters).</li>
<li><b>Check your report</b> and plan the next turn.</li>
</ol>
<b>Action Points (Energy):</b> you have a limited amount each turn, and it resets every turn.
<br><br>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Intro">><</button>>
<<button "Next">><<tutOpen "Tut_Stats">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>The Map, movement, and tiles</strong><br><br>
The world is a small grid map made of tiles. Your camp is always on exactly one tile.<br><br>
<b>What the map is used for:</b>
<ul>
<li><b>Quests and expeditions:</b> quests are tied to specific tiles. Some quests can appear on tiles next to your camp.</li>
<li><b>Discovery:</b> moving and scouting reveals what nearby tiles contain (resources, encounters, opportunities).</li>
<li><b>Other tribes:</b> you mainly discover other tribes by exploring tiles.</li>
</ul>
<b>Movement (simple rules):</b>
<ul>
<li>When you move, your camp changes to a new tile.</li>
<li>Being on a tile matters. Many quests and encounters only trigger if you are on the correct tile.</li>
</ul>
<b>Expeditions:</b><br> The <b>Expedition</b> button only appears when:
<ul>
<li>you have an <b>active</b> quest, and</li>
<li>your camp is standing on the quest’s <b>target tile</b>.</li>
</ul>
If you are not on the target tile, the button will not show up.
<br><br>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Powers">><</button>>
<<button "Next">><<tutOpen "Tut_Tribes">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Powers</strong><br><br>
Powers are rare, high-impact options that can appear during key moments (especially events).
<br><br>
<b>How they work:</b>
<ol>
<li>You must have the Power unlocked/owned.</li>
<li>You must have enough <b>Belief</b> to pay its cost.</li>
<li>If both are true, the Power appears as a clickable option.</li>
<li>If not, it may show as disabled with a tooltip.</li>
</ol>
<b>Example:</b> During a raid-defense prep you might see a Power option like <b>“Use the Spark (Belief)”</b> — but only if you own Spark and have enough Belief.
<br><br>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Belief">><</button>>
<<button "Next">><<tutOpen "Tut_Map">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Resources — Food, Resources, Goods, Population</strong><br><br>
These are your economy. You gain and spend them through plans, actions, and events.
<br><br>
<b>Food</b><br> Used to feed your people each turn. Many events also add or remove Food.
<br><br>
<b>Resources</b><br> Basic materials (wood, stone, hides, etc.). Used for development and often lost in raids or disasters. A large stockpile gives a small bonus to Military strength.
<br><br>
<b>Goods</b><br> Higher-value trade items. They can raise your long-term Stability baseline. Useful for trade and diplomacy, but harder to get.
<br><br>
<b>Population (Pops)</b><br> Your tribe size. More pops usually means more upkeep, but also more output. Pops grow slowly over time and can also be lost to events (and starvation).
<br><br>
<b>Where they change:</b>
<ul>
<li><b>Season Plans</b> — your main source of steady income (and some plans can boost growth).</li>
<li><b>Events</b> — can give or take Food, Resources, Goods, and sometimes Pops.</li>
<li><b>Trade</b> — often converts Resources into Food and/or Goods (sometimes Pops).</li>
<li><b>Raids</b> — can cost resources if you fail, retreat, or get counterattacked.</li>
<li><b>End of turn</b> — Food upkeep is paid, then pop growth is applied.</li>
</ul>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Stats">><</button>>
<<button "Next">><<tutOpen "Tut_Belief">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Stats — what they are</strong><br><br>
Stats are your main capabilities. They are used in events, actions, and dialogue checks.<br><br>
<b>Core stats:</b>
<ul>
<li><b>Wisdom</b> — insight and planning.</li>
<li><b>Strength</b> — raw power and fighting.</li>
<li><b>Endurance</b> — toughness and survival.</li>
<li><b>Leadership</b> — command and coordination. Can also increase your tribe’s military strength.</li>
<li><b>Charisma</b> — persuasion and social influence.</li>
<li><b>Stewardship</b> — logistics and efficiency. Can also reduce food upkeep.</li>
</ul>
<b>How checks work:</b><br> Most checks roll <b>Stat + d20</b> against a <b>DC</b> (difficulty). Bonuses or penalties can come from relationships, traits, and your tribe’s current situation (like military strength).
<br><br>
<b>Examples:</b>
<ul>
<li>Trade often uses <b>Stewardship</b> or <b>Charisma</b>.</li>
<li>Raids can use <b>Leadership</b> and <b>Strength</b>. Later, some fights use combined values (example: <b>Strength + Endurance + Mil</b>).</li>
</ul>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Loop">><</button>>
<<button "Next">><<tutOpen "Tut_Resources">><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Good to know</strong><br><br>
<b>1) Read the outcome lines.</b><br> Many events clearly show the exact check you rolled and what you gained/lost.
<br><br>
<b>2) Quests are location-based.</b><br> If a quest exists, moving to the target tile is often the key step — then <b>Expedition</b> becomes available.
<br><br>
<b>3) There is a long-term goal.</b><br> A victory condition can track defeating rival tribes in the region
<br><br>
And remember: you can revisit this any time from the <b>“?”</b> menu. Good luck godling! May the winds of fate favour you!
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Tribes">><</button>>
<<button "Finish">><<tutStop>><</button>>
</div><div class="hub-textbox tut-textbox">
<strong>Finding other tribes</strong><br><br>
Other tribes exist on the map as camps. The goal is to <b>find them</b>, <b>make contact</b>, then decide your relationship: trade, diplomacy, intimidation, or war.
<br><br>
<b>Step 1 — Discover a tribe (find their camp):</b>
<ul>
<li><b>Scout / explore</b> to reveal tiles until you see a tribe camp icon on the map.</li>
<li>You can also use <b>Seek other tribes</b>. This attempts contact with tribes in a <b>5x5 area</b> around your camp.
<ul>
<li><b>Closer tribes</b> are easier to reach.</li>
<li>If no tribe is in range, nothing happens.</li>
</ul>
</li>
</ul>
<b>Step 2 — Make contact (so they show up in the list):</b><br> A tribe only appears in <b>Other Tribes</b> after you have made <b>real contact</b> with them (not just seeing the icon).
<br><br>
<b>Step 3 — Use the Other Tribes screen:</b>
<ul>
<li><b>Info</b> shows what you know: their status, temperament, and any useful notes.</li>
<li><b>Visit</b> is the main way to interact directly.</li>
<li><b>Trade</b> lets you exchange resources.</li>
<li>Hostile actions (like <b>Raid</b>) can start conflicts and carry risk.</li>
</ul>
<b>Temperament (how they react):</b>
<ul>
<li>Each tribe has a temperament that influences how they respond to you.</li>
<li>Some tribes are easier to trade with, others respect strength, and some hold grudges.</li>
<li>Temperament affects options, outcomes, and how quickly relations improve or worsen.</li>
</ul>
<b>Other tribes and Season Plans:</b>
<ul>
<li>Other tribes run their own plans and economy in the background.</li>
<li>Their plan can change what they offer (or demand) in trade.</li>
<li>Some plans make them more defensive or aggressive for a time.</li>
<li>If you keep contact, you will sometimes notice changes in their behavior and options.</li>
</ul>
<b>Important:</b> the tribe list focuses on tribes you’ve actually contacted — not tribes you only spotted on the map.
<br><br>
</div>
<div class="hub-buttons tut-buttons">
<<button "Back">><<tutOpen "Tut_Map">><</button>>
<<button "Next">><<tutOpen "Tut_Tips">><</button>>
</div>\:: UI_Bindings [widget]
<<widget "refreshSidebarUnlocks">>
<<script>>
(function () {
const u = (State.variables.uiUnlocks || {});
const buttons = [
{ id: "btn-character", key: "character", passage: "Character" },
{ id: "btn-inventory", key: "inventory", passage: "Inventory" },
{ id: "btn-relationships", key: "relationships", passage: "Relationships" },
{ id: "btn-quests", key: "quests", passage: "Quests" },
{ id: "btn-faith", key: "faith", passage: "Faith" },
{ id: "btn-diplomacy", key: "diplomacy", passage: "Diplomacy" },
{ id: "btn-laws", key: "laws", passage: "Laws" },
{ id: "btn-map", key: "map", passage: "Map" },
// NEW: mode switch buttons (give them IDs in your HTML)
{ id: "mode-switch-status", key: "modeSwitch", action: "switch", target: "civ" },
{ id: "mode-switch-civ", key: "modeSwitch", action: "switch", target: "status" }
];
buttons.forEach(b => {
const el = document.getElementById(b.id);
if (!el) return;
// Disable based on unlock flag
el.disabled = !u[b.key];
el.onclick = function () {
const uu = State.variables.uiUnlocks || {};
if (!uu[b.key]) return;
if (b.action === "switch") {
// switch panel by setting active class
const panels = document.querySelectorAll("#sidebar .sidebar-panel");
panels.forEach(p => p.classList.remove("active"));
const tgt = document.querySelector('#sidebar .sidebar-panel[data-panel="' + b.target + '"]');
if (tgt) tgt.classList.add("active");
return;
}
// normal passage buttons
Engine.play(b.passage);
};
});
})();
<</script>>
<</widget>>
<<widget "setChatterVisibility">>
<<script>>
(function () {
const chatter = document.querySelector(".sidebar-chatter");
if (!chatter) return;
const title = String(State.temporary._passTitle || "");
const isHub = (title === "Hub_1");
chatter.classList.toggle("is-hidden", !isHub);
})();
<</script>>
<</widget>><div class="hub-textbox">
<b>You stand alone.</b><br><br> The last rival fires have gone out. No drums answer your drums now—only the wind and the waiting land.
</div>
<<button "Continue">>
<<goto "End_Of_Content">>
<</button>><div class="intro-creation no-click-sfx">
Yet your thoughts are interrupted by others—thoughts that are both alien and familiar. Your eyes, now finally in place after having been there since the beginning, see-feel beyond mere sight.
Across the void, you perceive them: dancing stars of light, each a consciousness like your own. Their fears echo your fears; their questions mirror your own. You sense their confusion, their wonder, their desperate search for meaning in this place that is nowhere and everywhere.
You reach out—not with hands you do not possess, but with the essence of your being. For a fleeting moment, connection sparks across the expanse. A shared recognition. A collective gasp of understanding…
Then nothing.
You are flying through space—through nothingness—at speeds terrifyingly fast yet agonizingly slow. Time stretches and compresses around you. You move toward a destination that is both random and predetermined, chosen and inevitable.
Before you, a rock covered in greens and blues grows larger with each moment that does not pass. You see the other souls too—falling stars racing toward the same destination, their lights trailing behind them like memories of futures they have not yet lived.
The planet calls to you, a siren song of gravity and promise. You are all falling together, separate yet united, toward a world that was always your home.
<<button "Though you have never seen it before.">>
<<goto "though you have never seen it before.">>
<</button>>
</div><<set $temp = 0>>
<div class="intro-grounded intro-prologue-shell no-click-sfx">
<div class="intro-lead">
$user awakens alone in an untamed land of forests and rivers, with no recollection of origin or purpose—only the certainty of being human.<br><br> And so are the ones who found you.
</div>
<<if $height < 160>>
The tribe members tower over you, their shadows falling like evening across your prone form. They gesture with concern, offering food and shelter to one they perceive as vulnerable—a child in an adult’s body, fragile in a world that shows little mercy.
<<elseif $height > 220>>
<<set $strength += 2>>
The tribe scatters at first sight of you, abandoning tools and food in panicked flight. Only the bravest hunters remain at a distance, weapons raised, uncertain whether they face a god or a monster. It takes days of patient stillness before they dare approach the being who stands like a living mountain.
<<elseif $height > 190>>
<<set $strength += 1>>
The tribe members step back when you approach, necks craned upward. They speak in hushed tones, pointing with fear and awe at the giant in their midst. Some make gestures to ward off spirits; others bow their heads in reverence.
<<else>>
The tribe regards you with cautious curiosity, eyes measuring every movement. There is no immediate judgment—only the careful evaluation of one human encountering another in a world where every stranger could mean danger or salvation.
<</if>>
Communication is crude but workable, built on gestures, shared labor, and time.
You join them—not as kin, not yet—but as something accepted.<br><br>
You spent the first years among the tribe proving yourself.<br> The way you did this was by…
<div class="intro-divider">
</div>
<div class="hub-buttons">
<<button "Hunting the great beasts that others feared">>
<<set $temp = 0>>
<<set $strength += 2>>
<<goto "TheEarlyYears">>
<</button>>
<<button "Weaving stories that captivated listeners and resolved conflicts">>
<<set $temp = 1>>
<<set $charisma += 2>>
<<goto "TheEarlyYears">>
<</button>>
<<button "Observing the patterns of nature that others missed">>
<<set $temp = 2>>
<<set $wisdom += 2>>
<<goto "TheEarlyYears">>
<</button>>
<<button "Enduring hardships that broke the spirits of others">>
<<set $temp = 3>>
<<set $endurance += 2>>
<<goto "TheEarlyYears">>
<</button>>
</div>
</div><<set $pops = random(18, 23)>><div class="intro-grounded intro-prologue-shell intro-dying no-click-sfx">
The bounty of the land begins to falter. Herds grow smaller. Some vanish entirely. Rivers run shallow. Berries thin. Game becomes wary and scarce.
Your ancient memories whisper of such cycles—worlds changing, balances shifting—but this knowledge brings little comfort. Your people watch their children grow hungry, their elders grow afraid.
<div class="intro-notification bad">
The stability you cultivated begins to fray at the edges… </div>
<<silently>>
<<set $stability -= 3>>
<</silently>>
You observe patterns others miss—the wind’s quiet shift, the altered calls of birds, the subtle lean of trees toward a distant horizon. The truth settles in your bones: this land is dying.
<br><br>
If your people are to survive, you must lead them elsewhere.
<br>
Under the cloak of night, you climb the highest peak and gaze outward, weighing the paths before you:
<div class="intro-divider">
</div>
<div class="hub-buttons">
<button disabled> North — Toward the cold mountains few dare to hunt
<span class="choice-note"></span>
</button>
<button disabled> South — Into vast grasslands stretching beyond sight
<span class="choice-note"></span>
</button>
<button disabled> East — Along the great river toward the distant sea
<span class="choice-note"></span>
</button>
<<button "West — Into forests so dense they swallow the light">>
<<goto "Migration_West">>
<</button>>
</div>
</div><<silently>>
/* Ensure flags exist */
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$campNpcs>><<set $campNpcs = []>><</if>>
<</silently>>
''<div class="hub-textbox">
Morning comes without ceremony.
Mist clings low to the ground, pale and thin, retreating as the fire is stirred back to life. The camp moves slowly—quiet steps, muted voices, the ordinary rhythm of another day beginning.
She still lives.
She lies near the edge of the firelight, wrapped in borrowed hides. The wound has been cleaned as well as it can be, packed with herbs and bound tight. It seeps, but it does not bleed freely.
At some point, she wakes.
The breath comes first—sharp, sudden. Her body tenses instinctively, muscles drawing in as if expecting hands already on her. Her eyes snap open, wild for a heartbeat.
They find you.
She freezes.
For a long moment, she says nothing. Her gaze flicks past you—taking in the fire, the shapes of your people, the unfamiliar layout of the camp. No panic follows. Only calculation.
Then she exhales, slow and controlled.
“You didn’t kill me,” she says.
It isn’t gratitude. Just fact.
After a pause, she inclines her head a fraction.
“Thank you.”
The word comes out rough, as if unused.
She does not linger on it.
“My brother is alive,” she says immediately. Certainty hardens her voice. “I would feel it if he were dead.”
Her eyes lock onto yours again, intensity flaring.
“They’ll find him,” she continues. “Soon. Or they already have. He can’t outrun hunters—not wounded, not alone.”
Her fingers curl into the hides beneath her, knuckles whitening.
“I won’t beg,” she says. “But I will ask.”
She shifts, pain flickering across her face, but she does not look away.
“Help me save him.”
She watches you closely now—not for kindness, not for mercy. For decision.
</div>''
<div class="hub-buttons">
<<button "Agree to help her">>
<<set $outcastMorningChoice = "help">>
<<goto "Event_meeting_brother_accept">>
<</button>>
<<button "Refuse">>
<<set $outcastMorningChoice = "refuse">>
<<goto "Event_meeting_brother_refuse">>
<</button>>
</div><div class="age-transition no-click-sfx">
<<set $CurrentAge = "Early Tribal">>
<<run setup.map.ensureCampSpawned()>>
<<run setup.map.randomizeTileYieldsOnce()>>
<<run setup.map.setPlayerSpawnTileBaseline()>>
<<silently>>
<<if !$uiUnlocks>><<set $uiUnlocks = {}>><</if>>
<<set $uiUnlocks.map = true>>
<<set $uiUnlocks.quests = true>>
<<set $uiUnlocks.character = true>>
<<set $uiUnlocks.inventory = true>>
<<set $uiUnlocks.relationships = false>>
<<set $uiUnlocks.modeSwitch = true>>
<<refreshSidebarUnlocks>>
<</silently>>
<div class="age-transition-shell">
<div class="age-transition-card">
<div class="age-transition-kicker">Age I</div>
<div class="age-transition-title">A New World</div>
<div class="age-transition-copy">The camp already breathes around you as if you had always stood at its center. Fires, hunger, worship, and want now gather beneath your shadow.</div>
<div class="age-transition-rule"></div>
<div class="age-transition-meta">
<span>Camp Awakened</span>
<span>Map Revealed</span>
<span>Season Begins</span>
</div>
<div class="age-transition-actions">
<<button "<span class='label'>Enter the camp</span><span class='sub'>Begin the first season</span>">>
<<set $tutorialPending = true>>
<<goto "Hub_1">>
<</button>>
</div>
<div class="age-transition-footer">The first fire is lit. The rest is yours to shape.</div>
</div>
</div>
<div class="menu-card">
<div class="menu-title">
AGE I — A NEW WORLD
</div>
<div class="menu-actions">
<<link "CONTINUE">>
<<set $tutorialPending = true>>
<<goto "Hub_1">>
<</link>>
</div>
</div>
</div><div class="intro-creation no-click-sfx">
As you descend toward the rock, you feel the weight of existence pressing upon you. You are made of lead yet weightless—a contradiction in motion. The impact will shatter worlds, or perhaps nothing at all. Fear and exhilaration merge into a single sensation you have no name for, a feeling both ancient and newborn.
Your body touches the ground with the impossible grace of a feather, leaving no trace of your arrival. You lie motionless, consciousness expanding to fill this new form—this vessel of flesh and bone.
The air here is different—heavier, addictive. Breathing is an instinct you do not yet possess, yet your lungs burn with a need you cannot name. The smells assault your senses: untamed wilderness, damp earth, decaying leaves giving way to new life. These are the first scents of your new existence.
And then—sound. A foreign concept made real. The rustle of leaves in trees you cannot see. The melodic calls of creatures with wings. And approaching footsteps, belonging to beings whose forms echo your own.
You try to rise, to meet these others, but your body rebels—unfamiliar, uncooperative. You are a newborn in adult form, ancient in your ignorance. The footsteps grow closer, accompanied by hushed voices in a language you somehow understand without knowing how.
They surround you, their faces a mixture of fear and curiosity. They are human, as you are human—yet different. You cannot name the difference, but you feel it in your very soul. They extend their hands to help you rise, and as your fingers touch theirs, memories flood your consciousness—
<<button "Not your own">>
<<goto "Your journey begins">>
<</button>>
</div>\:: widget[widget]
/* ======================================================
QUEST LOCATION CHECK
====================================================== */
<<widget "questAtPlayer">>
<<set _found = null>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<set _q = $quests[_i]>>
<<if _q.status is "active"
and _q.targetX is $campX
and _q.targetY is $campY>>
<<set _found = _q>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set $questHere = _found>>
<</widget>>
/* ======================================================
QUEST TRACK TOGGLE (MULTI-TRACK + UNTRACK) - AUTO UPDATE
====================================================== */
<<widget "QuestTrackToggleButton">>
<<nobr>>
<<set _qid = String($args[0] ?? "")>>
<<if !_qid>><<return>><</if>>
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<if !$untrackedQuestIds>><<set $untrackedQuestIds = []>><</if>>
/* Find quest name by id (so passage can call us with just id) */
<<set _qname = "Quest">>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set _qname = $quests[_i].name ?? _qname>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _tracked = ($trackedQuestIds.indexOf(_qid) >= 0)>>
<<capture _qid _qname>>
<<if _tracked>><<link "Hide Marker">>
/* Remove from tracked */
<<set _tmpT = []>>
<<for _t = 0; _t < $trackedQuestIds.length; _t++>>
<<set _curT = String($trackedQuestIds[_t])>>
<<if _curT is not _qid>>
<<set _tmpT.push(_curT)>>
<</if>>
<</for>>
<<set $trackedQuestIds = _tmpT>>
/* Add to untracked */
<<if $untrackedQuestIds.indexOf(_qid) is -1>>
<<set $untrackedQuestIds.push(_qid)>>
<</if>>
/* Toast */
<<set $questsToastText = "Map marker hidden: " + _qname>>
<<run $(".quests-toast").text(State.variables.questsToastText || "")>>
<<run $("#quests-tracked-count").text((State.variables.trackedQuestIds?.length ?? 0) + " tracked")>>
/* Force map redraw (try common hooks safely) */
<<run (function () {
try {
if (setup.map && typeof setup.map.render === "function") setup.map.render();
if (setup.map && typeof setup.map.refresh === "function") setup.map.refresh();
if (setup.map && typeof setup.map.draw === "function") setup.map.draw();
} catch (e) {}
})();>>
/* Re-render just this button label/state */
<<run $("#qtbtn-" + _qid + " .qtbtn-body").first().empty().wiki('<<QuestTrackToggleButton "' + _qid + '">>')>>
<<run $("#quest-track-state-" + _qid).empty().wiki('<<QuestTrackedStateTag "' + _qid + '">>')>>
<</link>><<else>><<link "Track Marker">>
/* Add to tracked */
<<if $trackedQuestIds.indexOf(_qid) is -1>>
<<set $trackedQuestIds.push(_qid)>>
<</if>>
/* Remove from untracked */
<<set _tmpU = []>>
<<for _u = 0; _u < $untrackedQuestIds.length; _u++>>
<<set _curU = String($untrackedQuestIds[_u])>>
<<if _curU is not _qid>>
<<set _tmpU.push(_curU)>>
<</if>>
<</for>>
<<set $untrackedQuestIds = _tmpU>>
/* Toast */
<<set $questsToastText = "Map marker tracked: " + _qname>>
<<run $(".quests-toast").text(State.variables.questsToastText || "")>>
<<run $("#quests-tracked-count").text((State.variables.trackedQuestIds?.length ?? 0) + " tracked")>>
/* Force map redraw (try common hooks safely) */
<<run (function () {
try {
if (setup.map && typeof setup.map.render === "function") setup.map.render();
if (setup.map && typeof setup.map.refresh === "function") setup.map.refresh();
if (setup.map && typeof setup.map.draw === "function") setup.map.draw();
} catch (e) {}
})();>>
/* Re-render just this button label/state */
<<run $("#qtbtn-" + _qid + " .qtbtn-body").first().empty().wiki('<<QuestTrackToggleButton "' + _qid + '">>')>>
<<run $("#quest-track-state-" + _qid).empty().wiki('<<QuestTrackedStateTag "' + _qid + '">>')>>
<</link>><</if>>
<</capture>>
<</nobr>>
<</widget>>
<<widget "QuestTrackedStateTag">>
<<nobr>>
<<set _qid = String($args[0] ?? "")>>
<<if !_qid>><<return>><</if>>
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<if ($trackedQuestIds.indexOf(_qid) >= 0)>>
<span class="quest-tag quest-tag-track">Tracked</span>
<<else>>
<span class="quest-tag quest-tag-dim">Untracked</span>
<</if>>
<</nobr>>
<</widget>>
<<widget "QuestTrackToggle">>
<<set _qid = String($args[0] ?? "")>>
<<if !_qid>><<return>><</if>>
<span @id="'qtbtn-' + _qid"><span class="qtbtn-body"><<QuestTrackToggleButton _qid>></span></span>
<</widget>>
/* ======================================================
EXPEDITION BUTTON
====================================================== */
<<widget "expeditionButton">>
<<questAtPlayer>>
<<if $questHere and $energy >= 1>>
<<button "Expedition">>
<<goto $questHere.expeditionPassage>>
<</button>>
<<else>>
<button class="hub-disabled expedition-disabled" disabled
title="<<if !$questHere>>No expedition available here.<<else>>Not enough energy.<<endif>>">
Expedition
</button>
<</if>>
<</widget>>
/* ======================================================
CAMP NPC MANAGEMENT
====================================================== */
/* Add NPC to camp
Usage:
<<addCampNpc
"npc_id"
"Display Name"
"PassageName"
"Optional short desc"
"Optional image path"
>>
*/
<<widget "addCampNpc">>
<<set _id = $args[0]>>
<<set _name = $args[1]>>
<<set _pass = $args[2]>>
<<set _desc = $args[3] ?? "">>
<<set _img = $args[4] ?? "">>
<<if !$campNpcs>><<set $campNpcs = []>><</if>>
/* find existing entry (if any) */
<<set _idx = -1>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<if $campNpcs[_i] and $campNpcs[_i].id is _id>>
<<set _idx = _i>>
<<break>>
<</if>>
<</for>>
<<if _idx is -1>>
/* new entry */
<<set $campNpcs.push({
id: _id,
name: _name,
passage: _pass,
desc: _desc,
img: _img
})>>
<<else>>
/* update existing entry */
<<set $campNpcs[_idx].name = _name>>
<<set $campNpcs[_idx].passage = _pass>>
<<set $campNpcs[_idx].desc = _desc>>
<<if _img and _img.trim()>>
<<set $campNpcs[_idx].img = _img>>
<</if>>
<</if>>
<</widget>>
/* ======================================================
NPC TALK: check + once-per-turn
====================================================== */
/* Usage:
<<npcCheck "npc_id" "charisma" 15>>
- auto-success if max(affection, obedience) >= 50
- otherwise rolls d20 and compares:
total = stat + roll
dc = baseDC - floor(max(aff,obed)/10)
Writes a green/red result line.
Stores:
$npcLastCheck = { ok, statKey, stat, roll, dc, relMod, total }
*/
<<widget "npcCheck">>
<<set _id = $args[0]>>
<<set _statK = $args[1]>>
<<set _baseDC = Number($args[2] ?? 15)>>
<<set _silent = ($args[3] is "silent")>>
<<set _autoTh = Number($args[4] ?? 50)>>
<<silently>>
/* locate person by id */
<<set _p = null>>
<<if $people and $people.length and _id>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _id>>
<<set _p = $people[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set _obed = Number(_p ? (_p.obedience ?? _p.influence ?? 0) : 0)>>
/* affection: Love if female, else Trust */
<<set _gender = _p ? (_p.gender ?? "male") : "male">>
<<set _isFemale = (_gender is "female") or (_p and _p.isFemale is true)>>
<<if _isFemale>>
<<set _affLabel = "Love">>
<<set _aff = Number(_p ? (_p.love ?? _p.trust ?? 0) : 0)>>
<<else>>
<<set _affLabel = "Trust">>
<<set _aff = Number(_p ? (_p.trust ?? 0) : 0)>>
<</if>>
<<set _rel = Math.max(_aff, _obed)>>
/* Auto-success threshold (param) */
<<set _auto = (_rel >= _autoTh)>>
/* roll */
<<set _roll = random(1, 20)>>
<<set _stat = Number(State.variables[_statK] ?? 0)>>
/* DC adjustment: higher relationship makes it easier */
<<set _relMod = Math.floor(_rel / 10)>>
<<set _dc = Math.max(5, _baseDC - _relMod)>>
<<set _total = _auto ? (_stat + 20) : (_stat + _roll)>>
<<set _ok = _auto or (_total >= _dc)>>
<<set $npcLastCheck = {
ok: _ok,
statKey: _statK,
stat: _stat,
roll: _roll,
dcBase: _baseDC,
dc: _dc,
rel: _rel,
relMod: _relMod,
autoThreshold: _autoTh,
auto: _auto,
total: _total,
affLabel: _affLabel,
aff: _aff,
obedience: _obed
}>>
<</silently>>
<<if !_silent>>
<<if $npcLastCheck.ok>>
<div class="npc-check npc-check-ok">
Check: (<<print $npcLastCheck.statKey>> <<print $npcLastCheck.stat>> + d20 <<print $npcLastCheck.roll>>)
= <<print $npcLastCheck.total>>
vs DC (<<print $npcLastCheck.dcBase>> - floor(max(Love/Trust,Obed)/10)=<<print $npcLastCheck.relMod>>)
= <<print $npcLastCheck.dc>>.
<b><<print $npcLastCheck.auto ? "AUTO SUCCESS!" : "Success!">></b>
</div>
<<else>>
<div class="npc-check npc-check-bad">
Check: (<<print $npcLastCheck.statKey>> <<print $npcLastCheck.stat>> + d20 <<print $npcLastCheck.roll>>)
= <<print $npcLastCheck.total>>
vs DC (<<print $npcLastCheck.dcBase>> - floor(max(Love/Trust,Obed)/10)=<<print $npcLastCheck.relMod>>)
= <<print $npcLastCheck.dc>>.
<b>Fail!</b>
</div>
<</if>>
<</if>>
<</widget>>
/* Usage:
<<npcOncePerTurn "npc_id" "compliment">>
Sets:
_canUse = true/false (temporary var)
*/
<<widget "npcOncePerTurn">>
<<set _id = $args[0]>>
<<set _key = $args[1]>>
<<if !$npcOncePerTurn>><<set $npcOncePerTurn = {}>><</if>>
<<if !$npcOncePerTurn[_id]>><<set $npcOncePerTurn[_id] = {}>><</if>>
<<set _usedTurn = $npcOncePerTurn[_id][_key] ?? -999>>
<<set _turnNow = Number($turn ?? State.variables.turn ?? 0)>>
<<set _canUse = (_usedTurn != _turnNow)>>
<</widget>>
<<widget "npcPrintLastCheck">>
<<if $npcLastCheck and $npcLastCheck.ok>>
<div class="npc-check npc-check-ok">
Stat check… <<print $npcLastCheck.statKey>> vs DC <<print $npcLastCheck.dc>>…
roll: <<print $npcLastCheck.roll>>. <b>Success!</b>
</div>
<<elseif $npcLastCheck>>
<div class="npc-check npc-check-bad">
Stat check… <<print $npcLastCheck.statKey>> vs DC <<print $npcLastCheck.dc>>…
roll: <<print $npcLastCheck.roll>>. <b>Fail!</b>
</div>
<</if>>
<</widget>>
<<widget "npcTalkStoreResult">>
<<set _tag = $args[0] ?? "Check">>
<<set _okText = $args[1] ?? "They hear you out.">>
<<set _badText = $args[2] ?? "The exchange closes down.">>
<<set _tone = ($npcLastCheck and $npcLastCheck.ok) ? "ok" : "bad">>
<<set _word = ($npcLastCheck and $npcLastCheck.ok) ? "SUCCESS" : "FAIL">>
<<set _body = ($npcLastCheck and $npcLastCheck.ok) ? _okText : _badText>>
<<set _statName = $npcLastCheck ? String($npcLastCheck.statKey ?? "stat").toUpperCase() : "STAT">>
<<set _total = $npcLastCheck ? Number($npcLastCheck.total ?? 0) : 0>>
<<set _dc = $npcLastCheck ? Number($npcLastCheck.dc ?? 0) : 0>>
<<set _prefix = ($npcLastCheck and $npcLastCheck.auto) ? "AUTO " : "">>
<<set $npcTalkOutput =
"<div class='talk-result talk-result--" + _tone + "'>" +
"<span class='talk-result-tag'>" + _tag + "</span>" +
"<span class='talk-result-roll'>" + _prefix + _word + " " + _statName + " " + _total + " / DC " + _dc + "</span>" +
"</div>" +
"<div class='npc-answer'>" + _body + "</div>"
>>
<</widget>>
<<widget "npcTalkStoreNote">>
<<set _tag = $args[0] ?? "Conversation">>
<<set _body = $args[1] ?? "">>
<<set _tone = $args[2] ?? "neutral">>
<<set $npcTalkOutput =
"<div class='talk-result talk-result--" + _tone + "'>" +
"<span class='talk-result-tag'>" + _tag + "</span>" +
"<span class='talk-result-roll'>NOTE</span>" +
"</div>" +
"<div class='npc-answer'>" + _body + "</div>"
>>
<</widget>>
<<widget "npcTalkUnified">>
<<silently>>
<<set _pid = $activePersonId ?? $selectedPersonId ?? $personSelectedId ?? $personInfoId>>
<<set _p = null>>
<<if $people and $people.length and _pid>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _pid>>
<<set _p = $people[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if !_p>>
<<goto "Interact">>
<</if>>
<<set _id = _p.id ?? _pid>>
<<set _here = "Talk_1">>
<<if !$npcTalkMenu>><<set $npcTalkMenu = {}>><</if>>
<<if !$npcTalkOutput>><<set $npcTalkOutput = "">><</if>>
<<if !$npcOncePerTurn>><<set $npcOncePerTurn = {}>><</if>>
<<if !$npcOncePerTurn[_id]>><<set $npcOncePerTurn[_id] = {}>><</if>>
<<if !$npcKnownNames>><<set $npcKnownNames = {}>><</if>>
<<if !$npcRevealedName>><<set $npcRevealedName = {}>><</if>>
<<if !$npcTalkMenu[_id]>>
<<set $npcTalkMenu[_id] = "root">>
<<set $npcTalkOutput = "">>
<<npcTalk _id>>
<</if>>
<<set _turnNow = Number($turn ?? State.variables.turn ?? 0)>>
<<set _visits = Number($npcTalks and $npcTalks[_id] ? $npcTalks[_id] : 1)>>
<<set _isFemale = ((_p.gender ?? "male") is "female") or (_p and _p.isFemale is true)>>
<<set _bondKey = _isFemale ? "love" : "trust">>
<<set _bondLabel = _isFemale ? "Love" : "Trust">>
<<set _bond = _isFemale ? Number(_p.love ?? _p.trust ?? 0) : Number(_p.trust ?? 0)>>
<<set _obed = Number(_p.obedience ?? _p.influence ?? 0)>>
<<set _role = String(_p.role ?? "Camp NPC").replace(/([a-z])([A-Z])/g, "$1 $2").replace(/_/g, " ")>>
<<if String(_role).toLowerCase() is "camp npc">><<set _role = "Camp NPC">><</if>>
<<set _name = _p.name ?? "Unknown">>
<<if _id is "npc_outcast">><<set _name = "Outcast">><</if>>
<<if _id is "npc_outcast_brother">><<set _name = "The Brother">><</if>>
<<if _id is "npc_wildling">><<set _name = "Wildling">><</if>>
<<if $npcKnownNames[_id] and $npcRevealedName[_id]>><<set _name = $npcRevealedName[_id]>><</if>>
<<set _profile = "generic">>
<<if _id is "npc_kael">><<set _profile = "kael">><</if>>
<<if _id is "npc_outcast_brother">><<set _profile = "brother">><</if>>
<<if _id is "npc_outcast">><<set _profile = "outcast">><</if>>
<<if _id is "npc_wildling">><<set _profile = "wildling">><</if>>
<<npcTalkQuestOfferAvailable _id>>
<<set _open = "They wait for you to decide what this conversation is going to be.">>
<<set _askNote = "Questions share one attempt per turn.">>
<<set _compOk = "The praise lands better than expected.">>
<<set _compBad = "The compliment falls flat.">>
<<set _roleOk = "You define their place cleanly enough that they accept it.">>
<<set _roleBad = "Your explanation sounds improvised, and they hear it.">>
<<set _totemActive = false>>
<<set _totemDone = false>>
<<set _offerQuest = !!_npcTalkQuestOfferAvailable>>
<<set _offerQuestKey = _npcTalkQuestOfferKey ?? "">>
<<set _offerQuestLabel = _npcTalkQuestOfferLabel ?? "">>
<<set _questOfferKicker = "Personal Request">>
<<set _questOfferCopy = "">>
<<set _questAcceptNote = "The task is now tracked on the map.">>
<<set _questRefuseNote = "They do not look pleased by the refusal.">>
<<if _profile is "kael">>
<<if _visits is 1>><<set _open = "Kael keeps one eye on the camp and one on you. 'Say it.'">><<elseif _visits is 2>><<set _open = "He gives you the smallest nod. 'What needs deciding?'">><<else>><<set _open = "Kael makes room for the conversation without wasting posture on comfort.">><</if>>
<<set _askNote = "Ask something useful. Kael gives more when the question has a point.">>
<<set _compOk = "Kael gives one short nod. He is not one to crave praise, but he accepts it as fair payment for good work.">>
<<set _compBad = "Kael barely reacts. 'Save polish for tools,' he says. 'Use plain words with me, $user.'">>
<<set _roleOk = "You frame his place cleanly: scout routes, read risk, keep the camp from walking blind. He approves without saying much.">>
<<set _roleBad = "He hears the uncertainty in it. 'If you do not know where to put me,' Kael says, 'do not fake certainty. Honesty suits you better.'">>
<<elseif _profile is "brother">>
<<if _visits is 1>><<set _open = "The Brother looks up like a man expecting bad news and finding only you instead.">><<elseif _visits is 2>><<set _open = "'What is it now?' he asks. Tired, not hostile.">><<else>><<set _open = "He keeps one shoulder angled toward the tree line even while he listens.">><</if>>
<<set _askNote = "Push too hard and he might shut down. Pick one question and make it count.">>
<<set _compOk = "He smiles boyishly. 'Heh. Coming from a man like you, I suppose I should be proud.'">>
<<set _compBad = "He looks aside. 'I, uh... thank you, $user.'">>
<<set _roleOk = "You tell him exactly what you need: sharp eyes and early warning. He nods. 'Of course. I owe you that much, at least.'">>
<<set _roleBad = "He hears the gap between need and authority and does not like it.">>
<<elseif _profile is "outcast">>
<<if _visits is 1>><<set _open = "She stiffens as you approach, then eases by a fraction. 'You again.'">><<elseif _visits is 2>><<set _open = "She watches the embers instead of you, searching them for some answer.">><<else>><<set _open = "She goes about her work, not noticing your approach immediately.">><</if>>
<<set _askNote = "One good question is worth more than three weak ones with her.">>
<<set _compOk = "A thin smile almost forms, then disappears. 'Those who have a clever tongue are usually trying to make up for something, you know.' The praise lands anyway, because it was spoken without pity.">>
<<set _compBad = "She raises an eyebrow. '...If you say so,' she says.">>
<<set _roleOk = "You name her use plainly: read the tree line, read strangers. Perhaps even other things, in time. She does not argue.">>
<<set _roleBad = "She goes still. Perhaps you worded yourself poorly. 'If I do not have a place here, say it plainly,' she says.">>
<<if $questFlags and $questFlags["q_valued_item_01"]>><<set _totemActive = true>><</if>>
<<if $quests and $quests.length>>
<<for _qi = 0; _qi < $quests.length; _qi++>>
<<if $quests[_qi].id is "q_valued_item_01" and $quests[_qi].status is "complete">><<set _totemDone = true>><<set _totemActive = false>><</if>>
<<if $quests[_qi].id is "q_valued_item_01" and $quests[_qi].status is not "complete">><<set _totemActive = true>><</if>>
<</for>>
<</if>>
<<elseif _profile is "wildling">>
<<if _visits is 1>><<set _open = "She watches you approach like she expects a trick and has already planned how to break from it.">><<elseif _visits is 2>><<set _open = "She is closer to the fire than before, but her eyes still follow your hands before your face.">><<else>><<set _open = "A low sound leaves her throat. Not a word. Not an invitation either. Just permission to continue.">><</if>>
<<set _askNote = "Keep it simple. She follows intent faster than language.">>
<<set _compOk = "She gives a slow wary nod. Whatever praise means to her, she does not reject it.">>
<<set _compBad = "She bares her teeth for an instant. The words land wrong, too smooth to trust.">>
<<set _roleOk = "You speak in simple terms: watch the dark, warn the camp, strike first when something slips through. The idea reaches her.">>
<<set _roleBad = "You lose her halfway through. Too many abstractions, not enough shape.">>
<</if>>
<<if _offerQuestKey is "q_valued_item_01">>
<<set _questOfferCopy = "Halona keeps her gaze on the fire before speaking. \"I dropped something in the trees while I was running,\" she says. \"A carved totem. Small. Easy to miss if you were not looking for it.\" She does not dress the request up as an order. \"I will not pretend it matters to anyone else. It matters to me. If you have the time, and if you find it, bring it back.\" She stops for a second, then adds, a bit hesitantly, \"...please.\"">>
<<set _questAcceptNote = "You agree to retrieve Halona's lost totem. The task is now tracked on the map.">>
<<set _questRefuseNote = "Her jaw tightens. \"Fine,\" she says. \"Forget I asked.\"">>
<<elseif _offerQuestKey is "q_kael_missing_scouts_01">>
<<set _questOfferCopy = "Kael waits until the noise around the fire drops. \"Two scouts I sent toward the river should have returned by now,\" he says. \"Maybe they found trouble. Maybe trouble found them. Either way, I do not like guessing.\" His eyes slide past the campfires into the dark. \"If we move camp toward the nearest stretch of river, we widen the ground we can search without bleeding days into blind wandering. Do that, and I will lead the first look myself.\"">>
<<set _questAcceptNote = "You agree to move camp toward the river and begin the search for Kael's missing scouts. The task is now tracked on the map.">>
<<set _questRefuseNote = "Kael's mouth hardens. \"Then we stay blind a little longer,\" he says. \"I do not like it.\"">>
<</if>>
<</silently>>
<<nobr>>
<div class="talk-wrap">
<div class="talk-shell">
<div class="talk-main">
<div class="talk-card talk-card--hero">
<div class="talk-kicker">Camp Conversation</div>
<div class="talk-title-row"><h2 class="talk-speaker"><<print String(_name).toUpperCase()>></h2></div>
<div class="talk-sub"><<print _role>></div>
<div class="talk-opening"><<print _open>></div>
<div class="talk-prompt">Compliment and Explain Their Role each have their own per-turn use. Questions share one per-turn use across the submenu.</div>
</div>
<div class="talk-card talk-card--response">
<div class="talk-section-label">Exchange</div>
<<if _offerQuest>>
<div class="talk-quest-offer">
<div class="talk-quest-kicker"><<print _questOfferKicker>></div>
<div class="talk-quest-title"><<print _offerQuestLabel || "Available Task">></div>
<div class="talk-quest-copy"><<print _questOfferCopy>></div>
<div class="talk-quest-actions">
<<button "Accept Task" _here>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$quests>><<set $quests = []>><</if>>
<<if !$trackedQuestIds>><<set $trackedQuestIds = []>><</if>>
<<set _qid = _offerQuestKey || "q_valued_item_01">>
<<set _exists = false>>
<<set _created = false>>
<<for _qj = 0; _qj < $quests.length; _qj++>>
<<if $quests[_qj].id is _qid>><<set _exists = true>><<break>><</if>>
<</for>>
<<if !_exists>>
<<if _qid is "q_valued_item_01">>
<<set $quests.push({
id: "q_valued_item_01",
name: "The Lost Totem",
desc: "Halona lost a small carved totem while fleeing through the forest.",
objective: "Travel to the marked tile and search for Halona's lost totem.",
status: "active",
targetX: 5,
targetY: 4,
markerRevealed: true,
expeditionPassage: "Quest_q_valued_item_01"
})>>
<<set _created = true>>
<<elseif _qid is "q_kael_missing_scouts_01">>
<<set _pick = setup.map.findNearestTerrainTileFromCamp ? setup.map.findNearestTerrainTileFromCamp("river", { excludeCurrent: true, requireTraversable: true }) : null>>
<<if _pick and _pick.ok>>
<<set $quests.push({
id: "q_kael_missing_scouts_01",
name: "The Missing Scouts",
desc: "Two scouts sent ahead toward the river have not returned. Kael wants the camp moved closer so the search can begin from there.",
objective: "Move camp to the marked river tile and search for the missing scouts.",
status: "active",
targetX: _pick.x,
targetY: _pick.y,
markerRevealed: true,
expeditionPassage: "Quest_q_kael_missing_scouts_01"
})>>
<<set _created = true>>
<<else>>
<<npcTalkStoreNote "Task Unavailable" "Kael has a direction in mind, but there is no suitable river tile to mark right now." "bad">>
<</if>>
<</if>>
<</if>>
<<if _exists or _created>>
<<set $questFlags[_qid] = true>>
<<if $trackedQuestIds.indexOf(_qid) is -1>><<set $trackedQuestIds.push(_qid)>><</if>>
<<set $trackedQuestId = _qid>>
<<npcTalkStoreNote "Task Accepted" _questAcceptNote "ok">>
<</if>>
<</button>>
<<button "Refuse" _here>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<set $questFlags[_offerQuestKey + "_refused"] = true>>
<<npcTalkStoreNote "Task Refused" _questRefuseNote "bad">>
<</button>>
</div>
</div>
<<elseif $npcTalkOutput>>
<<print $npcTalkOutput>>
<<else>>
<div class="talk-empty">
<div class="talk-empty-title"><<if $npcTalkMenu[_id] is "question">>Question Menu<<else>>Choose Your Approach<</if>></div>
<p><<print _askNote>></p>
</div>
<</if>>
</div>
</div>
<div class="talk-side">
<div class="talk-card talk-card--bond">
<div class="talk-section-label">Bond</div>
<div class="talk-bond-grid">
<div class="talk-bond-stat"><span><<print _bondLabel>></span><strong><<print _bond>></strong></div>
<div class="talk-bond-stat"><span>Obedience</span><strong><<print _obed>></strong></div>
</div>
</div>
<div class="talk-card talk-card--actions">
<div class="talk-section-label"><<if $npcTalkMenu[_id] is "question">>Question Options<<else>>Conversation Options<</if>></div>
<<if $npcTalkMenu[_id] is "root">>
<div class="talk-action-grid">
<<npcOncePerTurn _id "compliment">>
<<if _canUse>>
<<button "Compliment" _here>>
<<set $npcOncePerTurn[_id]["compliment"] = _turnNow>>
<<npcCheck _id "charisma" 14 "silent">>
<<if _p and $npcLastCheck.ok>><<set _p[_bondKey] = Number(_p[_bondKey] ?? _p.trust ?? 0) + 5>><<elseif _p>><<set _p[_bondKey] = Number(_p[_bondKey] ?? _p.trust ?? 0) - 5>><</if>>
<<npcTalkStoreResult "Compliment" _compOk _compBad>>
<</button>>
<<else>>
<button class="talk-action--disabled" disabled title="Already used this turn.">Compliment</button>
<</if>>
<<npcOncePerTurn _id "role">>
<<if _canUse>>
<<button "Explain Their Role" _here>>
<<set $npcOncePerTurn[_id]["role"] = _turnNow>>
<<npcCheck _id "wisdom" 15 "silent">>
<<if _p and $npcLastCheck.ok>><<set _p.obedience = Number(_p.obedience ?? _p.influence ?? 0) + 5>><<elseif _p>><<set _p.obedience = Number(_p.obedience ?? _p.influence ?? 0) - 5>><</if>>
<<npcTalkStoreResult "Role" _roleOk _roleBad>>
<</button>>
<<else>>
<button class="talk-action--disabled" disabled title="Already used this turn.">Explain Their Role</button>
<</if>>
<<button "Question" _here>><<set $npcTalkMenu[_id] = "question">><<set $npcTalkOutput = "">><</button>>
<button class="talk-action--disabled" disabled title="Gift is a placeholder for now.">Gift</button>
<<button "Return" "Interact">><<set $npcTalkOutput = "">><<run if (State.variables.npcTalkMenu && _id) { delete State.variables.npcTalkMenu[_id]; }>><</button>>
</div>
<<else>>
<div class="talk-question-list">
<<if _profile is "brother">>
<<button "What happened to your people?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pressed him for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 14 "silent">>
<<if _p and $npcLastCheck.ok>><<set _p.trust = Number(_p.trust ?? 0) + 5>><<elseif _p>><<set _p.trust = Number(_p.trust ?? 0) - 5>><</if>>
<<set _ok = "His stare goes far away. 'I was stupid.' He stops for a moment, then continues. 'No. Worse. I was weak. I let snakes too close and showed weakness. It almost cost me my life and, worse, my sister's.'">>
<<set _bad = "'You want the short version?' he says. 'We lost.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "Can I trust you at my fire?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pressed him for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 15 "silent">>
<<if _p and $npcLastCheck.ok>><<set _p.obedience = Number(_p.obedience ?? 0) + 5>><<elseif _p>><<set _p.obedience = Number(_p.obedience ?? 0) - 5>><</if>>
<<set _ok = "'What? Of course!' he says, sounding mildly insulted. 'You saved me and my sister. As far as I am concerned, you are family. If not by blood, then by the debt I owe you.'">>
<<set _bad = "He squares up. He does not seem to like the question. 'Why would you even ask me that?'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What does your sister need most?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pressed him for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 13 "silent">>
<<if _p and $npcLastCheck.ok>><<set _p.trust = Number(_p.trust ?? 0) + 5>><</if>>
<<set _ok = "After hearing your question, he looks around as if checking for a predator, then leans in and says conspiratorially, 'A calming herb. A strong one.' He leans back and chuckles to himself. 'Apart from that, nothing much. She's stubborn. She can make do with almost anything... Still, take care of her, will you?' He asks the last part with a hint of pleading hidden behind the joking tone.">>
<<set _bad = "He shrugs the question off. 'Who knows? Women are fickle, and she is worth ten women in that regard.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<elseif _profile is "kael">>
<<button "What worries you most?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked for his thinking this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 14 "silent">>
<<if _p and $npcLastCheck.ok>><<set _p.trust = Number(_p.trust ?? 0) + 5>><<elseif _p>><<set _p.trust = Number(_p.trust ?? 0) - 5>><</if>>
<<set _ok = "Kael does not answer fast. 'Waste,' he says at last. 'Waste of food. Waste of scouts. Waste of chances we do not get twice.'">>
<<set _bad = "He studies you instead of the question. 'Worry is for people who have time to sit in it.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "Why did you stay?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked for his thinking this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 15 "silent">>
<<if _p and $npcLastCheck.ok>><<set _p.trust = Number(_p.trust ?? 0) + 5>><<elseif _p>><<set _p.trust = Number(_p.trust ?? 0) - 5>><</if>>
<<set _ok = "'Because leaving would have been easier,' he says. 'Easy answers are usually wrong.'">>
<<set _bad = "'I stayed because I did. Do not carve meaning into every step.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "How would you move us if danger came?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked for his thinking this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 16 "silent">>
<<if _p and $npcLastCheck.ok>><<set _p.obedience = Number(_p.obedience ?? 0) + 5>><<elseif _p>><<set _p.obedience = Number(_p.obedience ?? 0) - 5>><</if>>
<<set _ok = "He sketches a route in the dirt. 'Pull in the loose hands. Send two eyes ahead. Keep noise behind the center. We compress.'">>
<<set _bad = "Kael folds his arms. 'If I have to build the whole thought for you here, we are already late.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<elseif _profile is "outcast">>
<<button "Where are you from?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pushed her for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 15 "silent">>
<<set _ok = "She answers after a pause. 'From a place by the lake. Stone, drums, and people who learned to look past hunger.'">>
<<set _bad = "Her mouth flattens. 'From before this camp. That is enough.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What should I call you?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pushed her for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 14 "silent">>
<<if $npcLastCheck.ok>>
<<set $npcKnownNames[_id] = true>>
<<set $npcRevealedName[_id] = "Halona">>
<<if _p>><<set _p.love = Number(_p.love ?? _p.trust ?? 0) + 5>><</if>>
<</if>>
<<set _ok = "She studies you for a long second. 'Halona,' she says. 'Do not spend it cheaply.'">>
<<set _bad = "'Names are leverage,' she says. 'You have not earned mine.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What are you still keeping from me?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already pushed her for answers this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<if _offerQuest>>
<<npcTalkStoreNote "Question" "She hesitates. There is a request sitting heavier on her than an answer. Hear her out if you want the full truth." "neutral">>
<<elseif _totemActive>>
<<npcTalkStoreNote "Question" "Her answer is brief. The totem is still out there. What matters now is bringing it back." "neutral">>
<<elseif _totemDone>>
<<npcTalkStoreNote "Question" "The old wound is quieter now. You already carried that burden for her once." "neutral">>
<<else>>
<<npcCheck _id "wisdom" 15 "silent">>
<<if _p and $npcLastCheck.ok>><<set _p.love = Number(_p.love ?? _p.trust ?? 0) + 5>><<elseif _p>><<set _p.love = Number(_p.love ?? _p.trust ?? 0) - 5>><</if>>
<<set _ok = "She exhales slowly. 'That I still expect bad endings,' she says. 'And that I do not know what to do with people who keep proving me wrong.'">>
<<set _bad = "Her eyes harden. 'Enough prying.'">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</if>>
<</button>>
<<elseif _profile is "wildling">>
<<button "Where did you come from?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already tried to pull meaning from her this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 14 "silent">>
<<set _ok = "She points into the dark beyond camp, then draws a crooked half circle across the dirt. Not here, and not welcome back there either.">>
<<set _bad = "She gives you a flat stare and taps the ground under your feet. Here. That is all you get.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What do you want from this camp?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already tried to pull meaning from her this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 15 "silent">>
<<set _ok = "Two fingers to her eyes. Palm lowering. Less danger. Then a quick gesture to her mouth. Food. Honest needs, plainly shown.">>
<<set _bad = "She bares her teeth in something that is half warning, half shrug. Whatever she wants, she will not phrase it for you.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "Why do you watch the tree line?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already tried to pull meaning from her this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 14 "silent">>
<<if _p and $npcLastCheck.ok>><<set _p.obedience = Number(_p.obedience ?? 0) + 5>><</if>>
<<set _ok = "She marks three quick points in the dirt, wipes them away, then jerks her chin outward. Something out there watches back.">>
<<set _bad = "The question spikes her. She turns, shoulders tight, and the rest of the answer disappears into instinct.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<else>>
<<button "How are you settling in?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked enough of them this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 12 "silent">>
<<set _ok = "They let out a breath and answer plainly enough. The camp is hard, but not hopeless.">>
<<set _bad = "They answer with polite brevity and keep the real thought to themselves.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What work fits you best?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked enough of them this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "wisdom" 13 "silent">>
<<set _ok = "Once you ask it that way, the answer comes easier. They tell you where their hands are most useful.">>
<<set _bad = "They shrug. Either they do not know yet or they do not think the answer matters.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<<button "What do you need from me?" _here>>
<<npcOncePerTurn _id "question">>
<<if !_canUse>>
<<npcTalkStoreNote "Question" "You already asked enough of them this turn." "bad">>
<<else>>
<<set $npcOncePerTurn[_id]["question"] = _turnNow>>
<<npcCheck _id "charisma" 14 "silent">>
<<set _ok = "The answer is modest and immediate: clarity, fairness, and a sense that tomorrow is being built on purpose.">>
<<set _bad = "They hesitate too long, then say they need nothing. It does not sound true.">>
<<npcTalkStoreResult "Question" _ok _bad>>
<</if>>
<</button>>
<</if>>
</div>
<div class="talk-inline-actions">
<<button "Back" _here>><<set $npcTalkMenu[_id] = "root">><<set $npcTalkOutput = "">><</button>>
<<button "Return" "Interact">><<set $npcTalkOutput = "">><<run if (State.variables.npcTalkMenu && _id) { delete State.variables.npcTalkMenu[_id]; }>><</button>>
</div>
<</if>>
</div>
</div>
</div>
</div>
<</nobr>>
<</widget>>
/* ======================================================
CAMP NPC LIST UI
====================================================== */
<<widget "campNpcList">>
<<if !$campNpcs or !$campNpcs.length>>
<div class="interact-empty">
Nobody of note to interact with is present.
</div>
<<else>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<set _n = $campNpcs[_i]>>
<div class="interact-card">
<<set _dispName =
($npcKnownNames and $npcKnownNames[_n.id] and $npcRevealedName and $npcRevealedName[_n.id])
? $npcRevealedName[_n.id]
: _n.name
>>
<div class="interact-name"><<print _dispName>></div>
<<if _n.desc>>
<div class="interact-desc"><<print _n.desc>></div>
<</if>>
<div class="interact-actions">
<<set _nid = _n.id>>
<<npcTalkQuestOfferAvailable _nid>>
<<set _talkQuestBadgeTitle = _npcTalkQuestOfferLabel ? "Quest available: " + _npcTalkQuestOfferLabel : "Quest available">>
<<capture _nid>>
<span class="interact-action-wrap">
<<link "Talk">>
<<set $activePersonId = _nid>>
<<set $personInfoTab = "friendly">>
<<set $npcTalkOutput = "">>
<<run if (!State.variables.npcTalkMenu) { State.variables.npcTalkMenu = {}; } if (_nid) { delete State.variables.npcTalkMenu[_nid]; }>>
<<goto "Talk_1">>
<</link>>
<<if _npcTalkQuestOfferAvailable>><span class="interact-talk-quest-badge" title="<<print _talkQuestBadgeTitle>>">!</span><</if>>
</span>
<<link "Info">>
<<set $activePersonId = _nid>>
<<set $personInfoTab = "friendly">>
<<goto "Person_Info">>
<</link>>
<</capture>>
</div>
</div>
<</for>>
<</if>>
<</widget>>
<<widget "npcTalkQuestOfferAvailable">>
/* add future talk-quest availability rules here so Interact and Talk stay in sync */
<<set _npcTalkQuestOfferAvailable = false>>
<<set _npcTalkQuestOfferKey = "">>
<<set _npcTalkQuestOfferLabel = "">>
<<set _qid = $args[0] ?? "">>
<<set _qp = null>>
<<if $people and $people.length and _qid>>
<<for _qi = 0; _qi < $people.length; _qi++>>
<<if $people[_qi] and $people[_qi].id is _qid>>
<<set _qp = $people[_qi]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if _qid is "npc_outcast">>
<<set _qBond = Number(_qp ? (_qp.love ?? _qp.trust ?? 0) : 0)>>
<<set _qObed = Number(_qp ? (_qp.obedience ?? _qp.influence ?? 0) : 0)>>
<<set _qBrotherDone = !!($questFlags and $questFlags["q_outcast_brother_01"])>>
<<set _qTotemActive = !!($questFlags and $questFlags["q_valued_item_01"])>>
<<set _qTotemDone = false>>
<<set _qRefused = !!($questFlags and $questFlags["q_valued_item_01_refused"])>>
<<if $quests and $quests.length>>
<<for _qj = 0; _qj < $quests.length; _qj++>>
<<if $quests[_qj].id is "q_outcast_brother_01" and $quests[_qj].status is "complete">><<set _qBrotherDone = true>><</if>>
<<if $quests[_qj].id is "q_valued_item_01" and $quests[_qj].status is not "complete">><<set _qTotemActive = true>><</if>>
<<if $quests[_qj].id is "q_valued_item_01" and $quests[_qj].status is "complete">><<set _qTotemDone = true>><<set _qTotemActive = false>><</if>>
<</for>>
<</if>>
<<if (_qBond >= 5 or _qObed >= 5) and _qBrotherDone and !_qTotemActive and !_qTotemDone and !_qRefused>>
<<set _npcTalkQuestOfferAvailable = true>>
<<set _npcTalkQuestOfferKey = "q_valued_item_01">>
<<set _npcTalkQuestOfferLabel = "The Lost Totem">>
<</if>>
<<elseif _qid is "npc_kael">>
<<set _qTrust = Number(_qp ? (_qp.trust ?? 0) : 0)>>
<<set _qObed = Number(_qp ? (_qp.obedience ?? _qp.influence ?? 0) : 0)>>
<<set _qTutorialDone = !!($questFlags and $questFlags["q_tutorial_end_complete"])>>
<<set _qTutorialTurn = Number(($questFlags and $questFlags["q_tutorial_end_completed_turn"]) ?? -999)>>
<<set _qTurnNow = Number($turn ?? State.variables.turn ?? 0)>>
<<set _qDelayMet = _qTutorialDone and (_qTurnNow >= (_qTutorialTurn + 2))>>
<<set _qOfferUnlocked = !!($questFlags and $questFlags["q_kael_missing_scouts_offer_unlocked"])>>
<<set _qKaelActive = !!($questFlags and $questFlags["q_kael_missing_scouts_01"])>>
<<set _qKaelDone = false>>
<<set _qKaelFailed = !!($questFlags and $questFlags["q_kael_missing_scouts_01_failed"])>>
<<set _qRefused = !!($questFlags and $questFlags["q_kael_missing_scouts_01_refused"])>>
<<if $quests and $quests.length>>
<<for _qj = 0; _qj < $quests.length; _qj++>>
<<if $quests[_qj].id is "q_kael_missing_scouts_01" and $quests[_qj].status is "active">><<set _qKaelActive = true>><</if>>
<<if $quests[_qj].id is "q_kael_missing_scouts_01" and $quests[_qj].status is "complete">><<set _qKaelDone = true>><<set _qKaelActive = false>><</if>>
<<if $quests[_qj].id is "q_kael_missing_scouts_01" and $quests[_qj].status is "failed">><<set _qKaelFailed = true>><<set _qKaelActive = false>><</if>>
<</for>>
<</if>>
<<if _qOfferUnlocked and !_qKaelActive and !_qKaelDone and !_qKaelFailed and !_qRefused>>
<<set _npcTalkQuestOfferAvailable = true>>
<<set _npcTalkQuestOfferKey = "q_kael_missing_scouts_01">>
<<set _npcTalkQuestOfferLabel = "The Missing Scouts">>
<</if>>
<</if>>
<</widget>>
<<widget "npcAnyTalkQuestOfferAvailable">>
<<set _anyNpcTalkQuestOfferAvailable = false>>
<<set _anyNpcTalkQuestOfferLabel = "">>
<<if $campNpcs and $campNpcs.length>>
<<for _ai = 0; _ai < $campNpcs.length; _ai++>>
<<set _campNpc = $campNpcs[_ai]>>
<<set _campNpcId = (_campNpc and _campNpc.id) ? _campNpc.id : "">>
<<if _campNpcId>>
<<npcTalkQuestOfferAvailable _campNpcId>>
<<if _npcTalkQuestOfferAvailable>>
<<set _anyNpcTalkQuestOfferAvailable = true>>
<<set _anyNpcTalkQuestOfferLabel = _npcTalkQuestOfferLabel ?? "">>
<<break>>
<</if>>
<</if>>
<</for>>
<</if>>
<</widget>>
/* ======================================================
NPC ALIVE CHECK
Usage:
<<npcAlive "npc_id">>
Result:
_npcAlive = true / false
====================================================== */
<<widget "npcAlive">>
<<set _npcAlive = false>>
<<set _nid = $args[0]>>
<<if $people and $people.length and _nid>>
<<for _i = 0; _i < $people.length; _i++>>
<<if $people[_i] and $people[_i].id is _nid>>
<<set _npcAlive = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
/* ======================================================
CAMP NPC UPDATES
====================================================== */
/* Rename NPC
Usage: <<renameCampNpc "npc_id" "New Name">>
*/
<<widget "renameCampNpc">>
<<set _id = $args[0]>>
<<set _newName = $args[1]>>
<<if $campNpcs>>
<<for _i = 0; _i < $campNpcs.length; _i++>>
<<if $campNpcs[_i].id is _id>>
<<set $campNpcs[_i].name = _newName>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
/* Track NPC conversations
Usage: <<npcTalk "npc_id">>
*/
<<widget "npcTalk">>
<<set _id = $args[0]>>
<<if !$npcTalks>><<set $npcTalks = {}>><</if>>
<<set $npcTalks[_id] = ($npcTalks[_id] ?? 0) + 1>>
<</widget>>
/* ======================================================
QUEST GENERATION (ADJACENT)
====================================================== */
/* Adds a quest to a random tile adjacent to the camp
Usage:
<<addQuestAdjacentToCamp
"quest_id"
"Quest Name"
"Description"
"Objective"
"QuestPassage">>
*/
<<widget "addQuestAdjacentToCamp">>
<<set _qid = $args[0]>>
<<set _name = $args[1]>>
<<set _desc = $args[2]>>
<<set _obj = $args[3]>>
<<set _pass = $args[4]>>
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* prevent duplicates */
<<if !$questFlags[_qid]>>
/* collect ORTHOGONAL adjacent tiles only (1 move: up/down/left/right) */
<<set _cands = []>>
<<set _dirs = [
{dx: 1, dy: 0},
{dx: -1, dy: 0},
{dx: 0, dy: 1},
{dx: 0, dy: -1}
]>>
<<for _i = 0; _i < _dirs.length; _i++>>
<<set _x = $campX + _dirs[_i].dx>>
<<set _y = $campY + _dirs[_i].dy>>
<<if _x >= 0 and _y >= 0 and _x < $mapSize and _y < $mapSize>>
<<set _cands.push({ x:_x, y:_y })>>
<</if>>
<</for>>
/* select random tile */
<<if _cands.length>>
<<set _pick = _cands[random(0, _cands.length - 1)]>>
<<set $quests.push({
id: _qid,
name: _name,
desc: _desc,
objective: _obj,
status: "active",
targetX: _pick.x,
targetY: _pick.y,
markerRevealed: true,
expeditionPassage: _pass
})>>
<<set $questFlags[_qid] = true>>
<</if>>
<</if>>
<</widget>>
/* ======================================================
GENERIC COUNTER (REUSABLE)
====================================================== */
<<widget "questCounterUpdate">>
<<set _qid = String($args[0] ?? "")>>
<<set _cur = Number($args[1] ?? 0)>>
<<set _goal = Number($args[2] ?? 0)>>
<<set _label = String($args[3] ?? "Progress")>>
<<if !_qid>><<return>><</if>>
<<if !_goal or _goal <= 0>><<set _goal = 1>><</if>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is _qid>>
<<set $quests[_i].progress = _cur>>
<<set $quests[_i].goal = _goal>>
<<set $quests[_i].objective = _label + ": " + _cur + "/" + _goal>>
<<if String($quests[_i].status) is "active" and _cur >= _goal>>
<<set $quests[_i].status = "complete">>
<</if>>
<<break>>
<</if>>
<</for>>
<</if>>
<</widget>>
/* ======================================================
MARKERLESS QUEST ADD (VICTORY / TRACKERS)
====================================================== */
<<widget "addQuestMarkerless">>
<<set _qid = String($args[0] ?? "")>>
<<set _name = String($args[1] ?? "")>>
<<set _desc = String($args[2] ?? "")>>
<<set _obj = String($args[3] ?? "")>>
<<set _pass = String($args[4] ?? "")>>
<<if !_qid or !_name>><<return>><</if>>
<<if !$quests>><<set $quests = []>><</if>>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
/* prevent duplicates */
<<if $questFlags[_qid]>><<return>><</if>>
<<set $questFlags[_qid] = true>>
<<set $quests.push({
id: _qid,
name: _name,
desc: _desc,
objective: _obj,
status: "active",
markerRevealed: false,
expeditionPassage: _pass
})>>
<</widget>>
/* ======================================================
VICTORY COUNTING
====================================================== */
<<widget "countEnemyTribesRemaining">>
/* Prefer stable list if we already captured it */
<<set _ids = $victoryCampIds>>
/* Otherwise ask setup.map */
<<if !_ids and setup.map and setup.map.getNpcCampIds>>
<<set _ids = setup.map.getNpcCampIds()>>
<</if>>
/* Fallback */
<<if !_ids>>
<<set _ids = ["npc_camp_1","npc_camp_2","npc_camp_3"]>>
<</if>>
<<if !$defeatedTribes>><<set $defeatedTribes = {}>><</if>>
<<set _total = _ids.length>>
<<set _defeated = 0>>
<<for _i = 0; _i < _ids.length; _i++>>
<<set _tid = String(_ids[_i])>>
<<if $defeatedTribes[_tid]>>
<<set _defeated++>>
<</if>>
<</for>>
/* lock the id list so it doesn't change mid-run */
<<set $victoryCampIds = $victoryCampIds ?? _ids>>
/* set initial once */
<<set $enemyTribesInitial = ($enemyTribesInitial ?? _total)>>
<<set $enemyTribesRemaining = _total - _defeated>>
<</widget>>
/* ======================================================
VICTORY QUEST START (CALL IN FINAL TUTORIAL)
====================================================== */
<<widget "startVictory_DominateRegion">>
<<if !$questFlags>><<set $questFlags = {}>><</if>>
<<if !$questFlags.q_dominate_region_started>>
<<set $questFlags.q_dominate_region_started = true>>
/* snapshot enemy list + baseline counts */
<<set $victoryCampIds = null>>
<<set $enemyTribesInitial = null>>
<<set $enemyTribesRemaining = null>>
<<countEnemyTribesRemaining>>
<<addQuestMarkerless
"q_dominate_region"
"Dominate the Region"
"Defeat every rival tribe until you stand alone."
("Tribes defeated: 0/" + $enemyTribesInitial)
"Quest_q_dominate_region"
>>
<</if>>
<</widget>>
/* ======================================================
VICTORY QUEST UPDATE (CALL IN HUB_1 EACH TURN)
====================================================== */
<<widget "updateVictory_DominateRegion">>
/* Don’t run unless started */
<<if !$questFlags>><<return>><</if>>
<<if !$questFlags.q_dominate_region_started>><<return>><</if>>
/* Find quest */
<<set _q = null>>
<<if $quests and $quests.length>>
<<for _i = 0; _i < $quests.length; _i++>>
<<if $quests[_i] and String($quests[_i].id) is "q_dominate_region">>
<<set _q = $quests[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Separate checks: never touch _q.status if _q is null */
<<if !_q>><<return>><</if>>
<<if String(_q.status) is not "active">><<return>><</if>>
/* Recount */
<<countEnemyTribesRemaining>>
/* Goal = number of rival tribes we locked in */
<<set _ids = $victoryCampIds ?? ["npc_camp_1","npc_camp_2","npc_camp_3"]>>
<<set _goal = _ids.length>>
<<set _defeated = _goal - Number($enemyTribesRemaining ?? 0)>>
/* Update reusable counter (also completes quest when met) */
<<questCounterUpdate "q_dominate_region" _defeated _goal "Tribes defeated">>
/* Re-check status after update (same object, but safe) */
<<if String(_q.status) is "complete">>
<<if !$victoryEndShown>>
<<set $victoryEndShown = true>>
<<if $victoryUseDialog>>
<<script>>
Dialog.setup("Victory");
Dialog.wiki("<<include 'Victory_DominateRegion_Dialog'>>");
Dialog.open();
<</script>>
<<else>>
<<goto "End_Of_Content">>
<</if>>
<</if>>
<</if>>
<</widget>>
/* ======================================================
CAMP CHATTER SELECTION
====================================================== */
<<widget "pickChatter">>
<<set _valid = []>>
<<if $chatterPool and $chatterPool.length>>
<<for _i = 0; _i < $chatterPool.length; _i++>>
<<set _c = $chatterPool[_i]>>
<<set _ok = false>>
<<switch _c.when>>
<<case "always">>
<<set _ok = true>>
<<case "low_food">>
<<set _ok = ($food ?? 0) <= $chatterThresholds.food.low>>
<<case "high_food">>
<<set _ok = ($food ?? 0) >= $chatterThresholds.food.high>>
<<case "low_stability">>
<<set _ok = ($stability ?? 0) <= $chatterThresholds.stability.low>>
<<case "high_stability">>
<<set _ok = ($stability ?? 0) >= $chatterThresholds.stability.high>>
<<case "low_zeal">>
<<set _ok = ($zeal ?? 0) <= $chatterThresholds.zeal.low>>
<<case "high_zeal">>
<<set _ok = ($zeal ?? 0) >= $chatterThresholds.zeal.high>>
<<default>>
<<if _c.when and _c.when.startsWith("flag:")>>
<<set _flag = _c.when.slice(5)>>
<<set _ok = !!($storyFlags and $storyFlags[_flag])>>
<</if>>
<</switch>>
<<if _ok>>
<<set _valid.push(_c.text)>>
<</if>>
<</for>>
<</if>>
/* ======================================================
HIGHEST-STAT CHATTER (dynamic injection)
- adds 1 eligible line per stat that is currently highest
- ties are allowed (all tied stats get their line)
======================================================= */
<<silently>>
<<set _statDefs = [
{ k:"strength", label:"strength", line:"“Don’t argue with the chieftain today. He broke a log with his bare hands today!”" },
{ k:"endurance", label:"endurance", line:"“The chieftain just keeps going. Doesn’t stop, doesn’t slow… it’s weird, but helpful when hunting.”" },
{ k:"wisdom", label:"wisdom", line:"“The chieftain sees what others dont. I understand why Kael supported him for chieftain way back when”" },
{ k:"leadership", label:"leadership", line:"“The way the chieftain commands us...Ive never seen anything quite like it”" },
{ k:"charisma", label:"charisma", line:"“The chieftain looked my way today...Do you think he will call me to his tent later? I hope he does.”" },
{ k:"stewardship",label:"stewardship",line:"“Strange how we’ve got more and more mouths to feend… but no one’s gone hungry.”" }
]>>
/* compute highest value among the tracked stats */
<<set _best = -999999>>
<<for _s = 0; _s < _statDefs.length; _s++>>
<<set _v = Number(State.variables[_statDefs[_s].k] ?? 0)>>
<<if _v > _best>><<set _best = _v>><</if>>
<</for>>
/* inject each stat’s line if it matches the highest */
<<for _s = 0; _s < _statDefs.length; _s++>>
<<set _v = Number(State.variables[_statDefs[_s].k] ?? 0)>>
<<if _v is _best>>
<<set _valid.push(_statDefs[_s].line)>>
<</if>>
<</for>>
<</silently>>
<<if _valid.length>>
<<set $dailyChatter = _valid[random(0, _valid.length - 1)]>>
<<else>>
<<set $dailyChatter = "The camp is quiet—too quiet.">>
<</if>>
<<run $('#ui-chatter').text(State.variables.dailyChatter)>>
<</widget>>
/* ======================================================
TRIBE STUFF
====================================================== */
<<widget "getTribeById">>
<<set _id = $args[0]>>
<<set _found = null>>
<<if $tribes and $tribes.length>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i].id is _id>>
<<set _found = $tribes[_i]>>
<<break>>
<</if>>
<</for>>
<</if>>
<<set $activeTribe = _found>>
<</widget>>
<<widget "tribeStatLine">>
<<set _stats = $args[0]>>
<<if _stats>>
<div class="tribe-statsline">
<<if _stats.fish is not null>><span class="tribe-stat">🐟 <<print _stats.fish>></span><</if>>
<<if _stats.food is not null>><span class="tribe-stat">🍖 <<print _stats.food>></span><</if>>
<<if _stats.hides is not null>><span class="tribe-stat">🧥 <<print _stats.hides>></span><</if>>
<<if _stats.wood is not null>><span class="tribe-stat">🪵 <<print _stats.wood>></span><</if>>
<<if _stats.stone is not null>><span class="tribe-stat">🪨 <<print _stats.stone>></span><</if>>
</div>
<</if>>
<</widget>>
<<widget "tribeRow">>
<<set _t = $args[0]>>
<<set _tid = String(_t.id)>>
<div class="tribe-card">
<div class="tribe-main">
<div class="tribe-name"><<print _t.name>></div>
<<tribeStatLine _t.stats>>
</div>
<div class="tribe-rel">
<div class="tribe-rel-label">Relations</div>
<div class="tribe-rel-val <<print (Number(_t.relations ?? 0) < 0 ? 'neg' : 'pos')>>">
<<print Number(_t.relations ?? 0)>>
</div>
</div>
<div class="tribe-act">
<<if !_t.contacted>>
<<capture _tid>>
<<button "First contact">>
<<set $activeTribeId = _tid>>
<<script>>
Dialog.setup("First contact");
Dialog.wiki("<<include 'Tribe_FirstContact_Dialog'>>");
Dialog.open();
<</script>>
<</button>>
<</capture>>
<<else>>
<<capture _tid>>
<<link "Info" "Tribe_Info">>
<<set $activeTribeId = _tid>>
<</link>>
<</capture>>
<</if>>
</div>
</div>
<</widget>>
<<widget "tribeList">>
<<set _any = false>>
<<if $tribes and $tribes.length>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<set _t = $tribes[_i]>>
/* SHOW RULE:
- contacted OR metTribeIds[id] (compat)
- NOT merely "discovered"
*/
<<if _t and ( !!_t.contacted or ($metTribeIds and $metTribeIds[_t.id]) )>>
<<set _any = true>>
<<tribeRow _t>>
<</if>>
<</for>>
<</if>>
<<if !_any>>
<div class="tribe-empty">You know of no other tribes… yet.</div>
<</if>>
<</widget>>
<<widget "destroyTribe">>
<<set _tid = String($args[0] ?? "")>>
<<if !_tid>><<return>><</if>>
/* One-time guard */
<<if !$defeatedTribes>><<set $defeatedTribes = {}>><</if>>
<<if $defeatedTribes[_tid]>><<return>><</if>>
/* Get tribe name BEFORE removal */
<<set _tname = "Unknown Tribe">>
<<if $tribes and $tribes.length>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is _tid>>
<<set _tname = $tribes[_i].name ?? _tname>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Mark defeated so patched JS won’t respawn camp/icon */
<<set $defeatedTribes[_tid] = true>>
/* Remove from $tribes */
<<if $tribes and $tribes.length>>
<<set $tribes = $tribes.filter(t => t and String(t.id) !== _tid)>>
<</if>>
/* Remove from canonical State.variables.tribes too (keeps setup.tribes in sync) */
<<run try { if (Array.isArray(State.variables.tribes)) { State.variables.tribes = State.variables.tribes.filter(t => t && String(t.id) !== _tid); } } catch (e) {} >>
/* Clear selections that point to this tribe */
<<if String($activeTribeId ?? "") is _tid>><<set $activeTribeId = null>><</if>>
<<if String($raidTargetId ?? "") is _tid>><<set $raidTargetId = null>><</if>>
/* Remove from known/aux stores (use delete to avoid <<unset>> expression issues) */
<<if $metTribeIds>><<run delete $metTribeIds[_tid]>><</if>>
<<if $otherTribeData>><<run delete $otherTribeData[_tid]>><</if>>
<<if $revealedNpcCamps>><<run delete $revealedNpcCamps[_tid]>><</if>>
<<if $scoutedNpcUntil>><<run delete $scoutedNpcUntil[_tid]>><</if>>
/* If $metTribes stores NAMES, remove by name */
<<if $metTribes and $metTribes.length>>
<<set $metTribes = $metTribes.filter(n => String(n) !== String(_tname))>>
<</if>>
/* Remove mirrored map icon entry if you use $mapIcons */
<<if $mapIcons and $mapIcons.length>>
<<set $mapIcons = $mapIcons.filter(ic => ic and String(ic.id) !== _tid)>>
<</if>>
/* Remove queued events (raid/trade/etc) belonging to that tribe */
<<if $eventQueue and $eventQueue.length>>
<<set $eventQueue = $eventQueue.filter(e => !(e and e.event and String(e.event.sourceTribeId ?? "") is _tid))>>
<</if>>
/* Queue ONE major event for end-turn Event screen */
<<set $lastDestroyedTribeId = _tid>>
<<set $lastDestroyedTribeName = _tname>>
<<script>>
(function () {
const V = SugarCube.State.variables;
const tid = String(V.lastDestroyedTribeId || "");
const tname = String(V.lastDestroyedTribeName || "Unknown Tribe");
if (!tid) return;
const payload = { sourceTribeId: tid, sourceTribeName: tname };
if (setup.eventEngine && typeof setup.eventEngine.queueMajorEventById === "function") {
setup.eventEngine.queueMajorEventById("major_tribe_destroyed", payload, { front: true });
} else if (setup.eventEngine && typeof setup.eventEngine.queueMajorEvent === "function") {
const def = (setup.eventEngine.events || []).find(e => e && e.id === "major_tribe_destroyed");
if (def) setup.eventEngine.queueMajorEvent(Object.assign({}, def, { data: payload }), { front: true });
}
})();
<</script>>
<</widget>>
<<widget "debugKillTribe">>
<<set _tid = String($args[0] ?? "")>>
<<if !_tid>>
<<print "No tribe id passed to debugKillTribe">>
<<return>>
<</if>>
/* Find the tribe and zero its population */
<<set _found = false>>
<<if $tribes and $tribes.length>>
<<for _i = 0; _i < $tribes.length; _i++>>
<<if $tribes[_i] and String($tribes[_i].id) is _tid>>
/* try all common population fields */
<<set $tribes[_i].pop = 0>>
<<set $tribes[_i].population = 0>>
<<if $tribes[_i].stats>>
<<set $tribes[_i].stats.population = 0>>
<</if>>
<<set _found = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if !_found>>
<<print "Tribe not found: " + _tid>>
<<return>>
<</if>>
/* Call your real destroy logic */
<<destroyTribe _tid>>
<<print "DEBUG: Tribe killed → " + _tid>>
<</widget>>
/*TUTORIAL*/
<<widget "tutOpen">>
<<set _p = $args[0]>>
<<run Dialog.setup("Tutorial")>>
<<run Dialog.wiki('<<include "' + _p + '">>')>>
<<run Dialog.open()>>
<</widget>>
<<widget "tutStart">>
<<tutOpen "Tut_Intro">>
<</widget>>
<<widget "tutStop">>
<<run Dialog.close()>>
<</widget>>
/* ======================================================
INVENTORY (ITEMS + EQUIPMENT) UI WIDGETS
- Parallel to Artifacts screen
====================================================== */
<<widget "invEnsure">>
<<run (function () {
try { if (setup.inventory && typeof setup.inventory.ensureState === "function") setup.inventory.ensureState(); } catch (e) {}
try {
State.variables.invFilter = String(State.variables.invFilter || "all").toLowerCase();
State.variables.invSort = String(State.variables.invSort || "type").toLowerCase();
if (setup.inventory && typeof setup.inventory.ensureUiState === "function") setup.inventory.ensureUiState();
} catch (e) {}
})();>>
<</widget>>
<<widget "invTabs">>
<<invEnsure>>
<div class="inv-tabs inv-mode-tabs" role="tablist" aria-label="Inventory views">
<<if $invTab is "items">>
<button class="macro-button inv-tab active is-current" disabled aria-current="page">Inventory</button>
<<else>>
<<button "Inventory">>
<<set $invTab = "items">>
<<goto "Inventory">>
<</button>>
<</if>>
<<if $invTab is "artifacts">>
<button class="macro-button inv-tab active" disabled>Artifacts</button>
<<else>>
<<button "Artifacts">>
<<set $invTab = "artifacts">>
<<goto "Inventory">>
<</button>>
<</if>>
</div>
<</widget>>
<<widget "invCapacitySummary">>
<<invEnsure>>
<<set _cap = (setup.inventory && setup.inventory.getCapacityMeta) ? setup.inventory.getCapacityMeta() : { used: 0, max: 0, pct100: 0, stateLabel: "Light", tone: "light" } >>
<div class="inv-capacity inv-capacity-modern is-<<print _cap.tone>>" title="Tracks occupied inventory slots. Higher load makes the inventory feel more crowded, even if it does not impose a movement penalty yet.">
<div class="inv-capacity-head">
<span class="inv-capacity-label">Carry</span>
<span class="inv-capacity-state"><<print _cap.stateLabel>></span>
<span class="inv-capacity-value"><<print _cap.used>> / <<print _cap.max>></span>
</div>
<div class="inv-capacity-bar">
<span class="inv-capacity-fill" style="width: <<print Math.max(4, _cap.pct100)>>%"></span>
</div>
</div>
<</widget>>
<<widget "invCollectionControls">>
<<invEnsure>>
<<set _flt = String($invFilter || "all")>>
<<set _sort = String($invSort || "type")>>
<div class="inv-collection-tools">
<div class="inv-chip-group">
<div class="inv-chip-group-label">Filter</div>
<div class="inv-chip-row">
<<for _opt range [{ key: "all", label: "All" }, { key: "materials", label: "Materials" }, { key: "consumables", label: "Consumables" }, { key: "gear", label: "Gear" }, { key: "quest", label: "Quest" }]>>
<<if _flt is _opt.key>>
<button type="button" class="macro-button inv-chip active" disabled><<print _opt.label>></button>
<<else>>
<<capture _opt>>
<<button _opt.label>>
<<set $invFilter = _opt.key>>
<<run setup.inventory.ensureUiState()>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
<</if>>
<</for>>
</div>
</div>
<div class="inv-chip-group is-sort">
<div class="inv-chip-group-label">Sort</div>
<div class="inv-chip-row">
<<for _opt range [{ key: "type", label: "Type" }, { key: "stack", label: "Stack" }, { key: "durability", label: "Durability" }, { key: "name", label: "Name" }]>>
<<if _sort is _opt.key>>
<button type="button" class="macro-button inv-chip active" disabled><<print _opt.label>></button>
<<else>>
<<capture _opt>>
<<button _opt.label>>
<<set $invSort = _opt.key>>
<<run setup.inventory.ensureUiState()>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
<</if>>
<</for>>
</div>
</div>
</div>
<</widget>>
<<widget "invItemGrid">>
<<invEnsure>>
<<set _order = (setup.inventory && setup.inventory.listViewUids) ? setup.inventory.listViewUids($invFilter, $invSort) : (($inv.order && $inv.order.length) ? $inv.order : Object.keys($inv.items))>>
<div class="inv-gridbox">
<div class="inv-grid">
<<if !_order.length>>
<div class="inv-grid-empty">No items match the current filter.</div>
<<else>>
<<for _i = 0; _i < _order.length; _i++>>
<<set _uid = String(_order[_i])>>
<<set _rec = $inv.items[_uid]>>
<<if !_rec>><<continue>><</if>>
<<set _def = setup.inventory.defById(_rec.id)>>
<<set _name = _def ? _def.name : _rec.id>>
<<set _imgSrc = setup.inventory.getItemIconSrc ? setup.inventory.getItemIconSrc(_rec.id) : ("images/Items/materials/" + String(_rec.id) + ".png")>>
<<set _typeLabel = setup.inventory.getItemTypeLabel ? setup.inventory.getItemTypeLabel(_def) : "Item">>
<<set _label = '<img class="inv-icon" src="' + _imgSrc + '" alt="' + _name + '" title="' + _name + " (" + _typeLabel + ")" + '">' >>
<<set _qty = Math.max(0, Number(_rec.qty || 0))>>
<<set _durMeta = (setup.inventory && setup.inventory.getDurabilityMeta) ? setup.inventory.getDurabilityMeta(_rec, _def) : null>>
<<set _sel = ($invSel and String($invSel) is _uid)>>
<<set _equippedSlot = (setup.inventory && setup.inventory.getEquippedSlotForUid) ? setup.inventory.getEquippedSlotForUid(_uid) : null>>
<div class="inv-cell inv-item-btn<<if _sel>> sel<</if>><<if _equippedSlot>> equipped<</if>><<if _durMeta>> dur-<<print _durMeta.tone>><</if>>" data-uid="<<print _uid>>">
<div class="inv-cell-flag"><<print _typeLabel>></div>
<<if _sel>>
<div class="inv-cell-pin">Selected</div>
<</if>>
<<capture _uid _label>>
<<button _label>>
<<set $invSel = String(_uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
<<if _durMeta>>
<div class="inv-cell-dur inv-cell-dur-badge is-<<print _durMeta.tone>>"><<print _durMeta.label>></div>
<div class="inv-cell-durbar is-<<print _durMeta.tone>>"><span style="width: <<print _durMeta.pct100>>%"></span></div>
<</if>>
<<if _qty && _qty > 1>>
<div class="inv-cell-qty"><<print _qty>></div>
<</if>>
</div>
<</for>>
<</if>>
</div>
</div>
<</widget>>
<<widget "invDetailsFooter">>
<<invEnsure>>
<<invDetails>>
<</widget>>
<<widget "invEquipPanel">>
<<invEnsure>>
<<set _head = (setup.inventory && setup.inventory.getEquipSlotDisplayData) ? setup.inventory.getEquipSlotDisplayData("Head", $invSel) : null>>
<<set _body = (setup.inventory && setup.inventory.getEquipSlotDisplayData) ? setup.inventory.getEquipSlotDisplayData("Body", $invSel) : null>>
<<set _armL = (setup.inventory && setup.inventory.getEquipSlotDisplayData) ? setup.inventory.getEquipSlotDisplayData("ArmLeft", $invSel) : null>>
<<set _armR = (setup.inventory && setup.inventory.getEquipSlotDisplayData) ? setup.inventory.getEquipSlotDisplayData("ArmRight", $invSel) : null>>
<<set _legs = (setup.inventory && setup.inventory.getEquipSlotDisplayData) ? setup.inventory.getEquipSlotDisplayData("Legs", $invSel) : null>>
<div class="inv-equip-board-shell">
<div class="inv-equip-board">
<div class="inv-equip-silhouette" aria-hidden="true"></div>
<div class="inv-equip-node equip-head">
<div class="inv-equip-node-slot">Head</div>
<<if _head and _head.hasItem>>
<<set _label = '<img class="equip-icon" src="' + _head.iconSrc + '" alt="' + _head.name + '" title="' + _head.title + '">' >>
<div class="inv-equip-node-item">
<<capture _head _label>>
<<button _label>>
<<set $invSel = String(_head.uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
</div>
<div class="inv-equip-node-name"><<print _head.name>></div>
<<if _head.durability>><div class="inv-equip-node-dur"><<print _head.durability.label>></div><</if>>
<<else>>
<div class="inv-equip-node-empty">Empty</div>
<</if>>
</div>
<div class="inv-equip-node equip-arm-left">
<div class="inv-equip-node-slot">Arm L</div>
<<if _armL and _armL.hasItem>>
<<set _label = '<img class="equip-icon" src="' + _armL.iconSrc + '" alt="' + _armL.name + '" title="' + _armL.title + '">' >>
<div class="inv-equip-node-item">
<<capture _armL _label>>
<<button _label>>
<<set $invSel = String(_armL.uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
</div>
<div class="inv-equip-node-name"><<print _armL.name>></div>
<<if _armL.durability>><div class="inv-equip-node-dur"><<print _armL.durability.label>></div><</if>>
<<else>>
<div class="inv-equip-node-empty">Empty</div>
<</if>>
</div>
<div class="inv-equip-node equip-body">
<div class="inv-equip-node-slot">Body</div>
<<if _body and _body.hasItem>>
<<set _label = '<img class="equip-icon" src="' + _body.iconSrc + '" alt="' + _body.name + '" title="' + _body.title + '">' >>
<div class="inv-equip-node-item">
<<capture _body _label>>
<<button _label>>
<<set $invSel = String(_body.uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
</div>
<div class="inv-equip-node-name"><<print _body.name>></div>
<<if _body.durability>><div class="inv-equip-node-dur"><<print _body.durability.label>></div><</if>>
<<else>>
<div class="inv-equip-node-empty">Empty</div>
<</if>>
</div>
<div class="inv-equip-node equip-arm-right">
<div class="inv-equip-node-slot">Arm R</div>
<<if _armR and _armR.hasItem>>
<<set _label = '<img class="equip-icon" src="' + _armR.iconSrc + '" alt="' + _armR.name + '" title="' + _armR.title + '">' >>
<div class="inv-equip-node-item">
<<capture _armR _label>>
<<button _label>>
<<set $invSel = String(_armR.uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
</div>
<div class="inv-equip-node-name"><<print _armR.name>></div>
<<if _armR.durability>><div class="inv-equip-node-dur"><<print _armR.durability.label>></div><</if>>
<<else>>
<div class="inv-equip-node-empty">Empty</div>
<</if>>
</div>
<div class="inv-equip-node equip-legs">
<div class="inv-equip-node-slot">Legs</div>
<<if _legs and _legs.hasItem>>
<<set _label = '<img class="equip-icon" src="' + _legs.iconSrc + '" alt="' + _legs.name + '" title="' + _legs.title + '">' >>
<div class="inv-equip-node-item">
<<capture _legs _label>>
<<button _label>>
<<set $invSel = String(_legs.uid)>>
<<run setup.inventory.refreshUi()>>
<</button>>
<</capture>>
</div>
<div class="inv-equip-node-name"><<print _legs.name>></div>
<<if _legs.durability>><div class="inv-equip-node-dur"><<print _legs.durability.label>></div><</if>>
<<else>>
<div class="inv-equip-node-empty">Empty</div>
<</if>>
</div>
</div>
<<if $inv and $inv.log and $inv.log.length>>
<div class="inv-log">
<<for _i = Math.max(0, $inv.log.length - 3); _i < $inv.log.length; _i++>>
<div class="inv-log-line"><<print $inv.log[_i]>></div>
<</for>>
</div>
<</if>>
</div>
<</widget>>
<<widget "invDetails">>
<<invEnsure>>
<<set _items = ($inv and $inv.items) ? $inv.items : {}>>
<<if !$invSel>>
<div class="inv-details-empty">Select an item to view details.</div>
<<else>>
<<set _rec = _items[$invSel]>>
<<if !_rec>>
<<set $invSel = null>>
<div class="inv-details-empty">That item is no longer available.</div>
<<else>>
<<set _id = String(_rec.id)>>
<<set _def = (setup.inventory && setup.inventory.defById) ? setup.inventory.defById(_id) : null>>
<<set _name = _def ? _def.name : _id>>
<<set _desc = _def ? _def.desc : "">>
<<set _tags = (_def and _def.tags) ? _def.tags : []>>
<<set _slot = _tags.includes("Head") ? "Head" : (_tags.includes("Body") ? "Body" : (_tags.includes("ArmLeft") ? "ArmLeft" : (_tags.includes("ArmRight") ? "ArmRight" : (_tags.includes("Legs") ? "Legs" : ""))))>>
<<set _type = (setup.inventory and setup.inventory.getItemTypeLabel) ? setup.inventory.getItemTypeLabel(_def) : (_slot ? "Armor" : (_tags.includes("Consumable") ? "Consumable" : (_tags.includes("Material") ? "Material" : (_tags.includes("Artifact") or _tags.includes("Relic") ? "Artifact" : "Item"))))>>
<<set _slotLabel = _slot is "ArmLeft" ? "Left Arm" : (_slot is "ArmRight" ? "Right Arm" : _slot)>>
<<set _stack = _def ? !!_def.stackable : false>>
<<set _equipped = (_slot and $inv and $inv.equipped and $inv.equipped[_slot] is $invSel)>>
<<set _qty = Math.max(0, Math.floor(Number(_rec.qty || 0)))>>
<<set _durMeta = (setup.inventory and setup.inventory.getDurabilityMeta) ? setup.inventory.getDurabilityMeta(_rec, _def) : null>>
<<set _slotTaken = (_slot and $inv and $inv.equipped and $inv.equipped[_slot]) ? $inv.equipped[_slot] : null>>
<<set _slotTakenName = (_slotTaken and _slotTaken is not $invSel and $inv.items[_slotTaken]) ? ((setup.inventory and setup.inventory.defById and setup.inventory.defById($inv.items[_slotTaken].id)) ? setup.inventory.defById($inv.items[_slotTaken].id).name : $inv.items[_slotTaken].id) : "">>
<<set _effects = []>>
<<if _def and _def.equipEffects and _def.equipEffects.length>><<set _effects = _effects.concat(_def.equipEffects)>><</if>>
<<if _def and _def.useEffects and _def.useEffects.length>><<set _effects = _effects.concat(_def.useEffects)>><</if>>
<<if !_effects.length and _def and _def.effects and _def.effects.length>><<set _effects = _effects.concat(_def.effects)>><</if>>
<div class="inv-details">
<div class="inv-details-main">
<div class="inv-details-kicker"><<print _type>></div>
<div class="inv-details-title"><<print _name>></div>
<<if _desc>>
<div class="inv-details-desc"><<print _desc>></div>
<</if>>
<div class="inv-details-meta">
<div><b>Type:</b> <<print _type>></div>
<<if _stack or _qty > 1>>
<div><b>Stack:</b> x<<print _qty > 0 ? _qty : 1>></div>
<</if>>
<<if _slot>>
<div><b>Slot:</b> <<print _slotLabel>></div>
<</if>>
<<if _durMeta>>
<div><b>Durability:</b> <<print _durMeta.label>></div>
<</if>>
<<if _equipped>>
<div><b>Status:</b> Equipped</div>
<<elseif _slotTaken and _slotTaken is not $invSel>>
<div><b>Status:</b> Slot occupied</div>
<</if>>
</div>
<<if _durMeta>>
<div class="inv-details-durbar is-<<print _durMeta.tone>>"><span style="width: <<print _durMeta.pct100>>%"></span></div>
<</if>>
<<if _effects.length>>
<div class="inv-details-section-title">Effects</div>
<div class="inv-details-effects">
<<for _i = 0; _i < _effects.length; _i++>>
<<set _eff = _effects[_i]>>
<div class="inv-details-effect">
<<if _eff and _eff.label>><span class="inv-effect-label"><<print _eff.label>></span><</if>>
<<if _eff and _eff.text>><span class="inv-effect-text"><<print _eff.text>></span><</if>>
<<if _eff and _eff.durationTurns !== undefined and _eff.durationTurns !== null>>
<span class="inv-effect-meta"><<print Number(_eff.durationTurns)>>t</span>
<</if>>
</div>
<</for>>
</div>
<</if>>
</div>
<div class="inv-details-actions">
<<if _slot>>
<<if _equipped>>
<<button "Unequip">>
<<run setup.inventory.unequip(String($invSel))>>
<<run setup.inventory.refreshUi()>>
<</button>>
<<elseif !_slotTaken>>
<<button "Equip">>
<<run setup.inventory.equip(String($invSel))>>
<<run setup.inventory.refreshUi()>>
<</button>>
<<else>>
<button class="macro-button inv-disabled" disabled title="That slot is already occupied.">Equip</button>
<div class="inv-action-note"><<print _slotTakenName ? ("Occupied by " + _slotTakenName + ".") : "That slot is already occupied.">></div>
<</if>>
<<elseif _type is "Consumable">>
<<if _qty > 0>>
<<button "Use">>
<<run (setup.inventory && setup.inventory.useConsumable ? setup.inventory.useConsumable(String(_id), 1) : setup.inventory.consume(String(_id), 1))>>
<<run setup.inventory.refreshUi()>>
<</button>>
<<else>>
<button class="macro-button inv-disabled" disabled>Use</button>
<</if>>
<</if>>
</div>
</div>
<</if>>
<</if>>
<</widget>>
<<widget "invDebugGrant">>
<<invEnsure>>
<details class="inv-debug-drawer">
<summary>Dev</summary>
<div class="inv-debug-panel">
<<button "Grant test items">>
<<run setup.inventory.grantTest()>>
<<goto "Inventory">>
<</button>>
</div>
</details>
<</widget>>
/* ===== CRAFTING WIDGETS (reverted to fix6) ===== */
<<widget "craftEnsure">>
<<nobr>>
<<run setup.inventory && setup.inventory.ensureState ? setup.inventory.ensureState() : null>>
<<if $craft is undefined or $craft is null>>
<<set $craft = { sel: "" }>>
<</if>>
<<if $craft.sel is undefined or $craft.sel is null>>
<<set $craft.sel = "" >>
<</if>>
<<if $craft.filter is undefined or $craft.filter is null>>
<<set $craft.filter = "all" >>
<</if>>
<<run setup.crafting && setup.crafting.ensure ? setup.crafting.ensure() : null>>
<<run (function(){
try {
if (!State.variables.craft) State.variables.craft = { sel:"", filter:"all" };
if (setup.crafting && typeof setup.crafting.normalizeFilter === "function") {
State.variables.craft.filter = setup.crafting.normalizeFilter(State.variables.craft.filter);
} else {
State.variables.craft.filter = String(State.variables.craft.filter || "all");
}
} catch (e) {}
})();>>
<<set _ids = (setup.crafting && setup.crafting.listIdsFiltered)
? setup.crafting.listIdsFiltered($craft.filter)
: ((setup.crafting && setup.crafting.listIds) ? setup.crafting.listIds() : Object.keys((setup.crafting && setup.crafting.recipes) ? setup.crafting.recipes : {}))>>
<<if !_ids.length>>
<<set $craft.sel = "" >>
<<elseif (not $craft.sel or _ids.indexOf(String($craft.sel)) is -1)>>
<<set $craft.sel = String(_ids[0])>>
<</if>>
<</nobr>>
<</widget>>
<<widget "craftRecipeFilters">>
<<nobr>>
<<craftEnsure>>
<<set _cur = String($craft.filter || "all")>>
<<set _filters = [
{ key: "all", icon: "◈", label: "All recipes" },
{ key: "equipment", icon: "🪓", label: "Gear" },
{ key: "consumable", icon: "🧪", label: "Consumables" },
{ key: "material", icon: "🪵", label: "Materials" },
{ key: "quest", icon: "❗", label: "Quest items" }
]>>
<div class="craft-category-bar" role="tablist" aria-label="Recipe category filters">
<<for _opt range _filters>>
<<set _label = "<span class='craft-category-icon' aria-hidden='true'>" + _opt.icon + "</span><span class='craft-category-sr'>" + _opt.label + "</span>">>
<div class="craft-category-slot<<if _cur is _opt.key>> active<</if>>" data-filter="<<print _opt.key>>">
<<capture _opt _label>>
<<button _label>>
<<run setup.openCraftFilter ? setup.openCraftFilter(_opt.key) : null>>
<</button>>
<</capture>>
<span class="craft-category-tip"><<print _opt.label>></span>
</div>
<</for>>
</div>
<</nobr>>
<</widget>>
<<widget "craftRecipeList">>
<<nobr>>
<<craftEnsure>>
<<set _ids = (setup.crafting && setup.crafting.listIdsFiltered)
? setup.crafting.listIdsFiltered($craft.filter)
: setup.crafting.listIds()>>
<div class="craft-recipes"><<if !_ids.length>><div class="craft-empty">— No recipes in this category —</div><<else>><<for _i = 0; _i < _ids.length; _i++>><<set _rid = String(_ids[_i])>><<set _r = setup.crafting.recipes[_rid]>><<if !_r>><<continue>><</if>><<set _name = _r.name ? String(_r.name) : _rid>><<set _isSel = (String($craft.sel) is _rid)>><div class="craft-recipe-row<<if _isSel>> active<</if>>" data-rid="<<print _rid>>"><<capture _rid _name>><<button _name>><<run setup.openCraftRecipe(String(_rid))>><</button>><</capture>></div><</for>><</if>></div>
<</nobr>>
<</widget>>
<<widget "craftDetailPanel">>
<<nobr>>
<<craftEnsure>>
<<set _rid = String($craft.sel)>>
<<set _r = setup.crafting.recipes[_rid]>>
<<if !_r>>
<div class="craft-empty-detail">Select a recipe on the left.</div>
<<else>>
<<set _st = setup.crafting.status(_rid)>>
<div class="craft-right-top">
<div class="craft-title"><<print _r.name>></div>
<div class="craft-sub">Workbench</div>
</div>
<div class="craft-req-grid">
<!-- ingredient boxes -->
<<for _j = 0; _j < _st.reqs.length; _j++>>
<<set _q = _st.reqs[_j]>>
<div class="craft-reqbox">
<div class="craft-req-title"><<print _q.label>></div>
<div class="craft-req-amt<<if _q.ok>> ok<<else>> bad<</if>>">Amount: <<print _q.have>>/<<print _q.need>></div>
</div>
<</for>>
<!-- terrain box -->
<div class="craft-reqbox">
<div class="craft-req-title">Terrain</div>
<div class="craft-req-amt<<if _st.terrain.ok>> ok<<else>> bad<</if>>"><<print _st.terrain.text>></div>
</div>
</div>
<!-- Stat changes / effects preview -->
<<set _outId = (_r.output && _r.output.id) ? String(_r.output.id) : _rid>>
<<set _outDef = (setup.inventory && setup.inventory.db && _outId && setup.inventory.db[_outId]) ? setup.inventory.db[_outId] : null>>
<<set _eff = []>>
<<if _r.effects && _r.effects.length>><<set _eff = _eff.concat(_r.effects)>><</if>>
<<if _outDef && _outDef.equipEffects && _outDef.equipEffects.length>><<set _eff = _eff.concat(_outDef.equipEffects)>><</if>>
<<if _outDef && _outDef.useEffects && _outDef.useEffects.length>><<set _eff = _eff.concat(_outDef.useEffects)>><</if>>
<div class="craft-effectsbox">
<div class="craft-effects-head">STAT CHANGES</div>
<<if _eff.length>>
<ul class="craft-effects-list">
<<for _k = 0; _k < _eff.length; _k++>>
<<set _e = _eff[_k]>>
<<set _lab = (_e && _e.label) ? String(_e.label) : "Effect">>
<<set _txt = (_e && _e.text) ? String(_e.text) : "">>
<<set _dur = (_e && _e.durationTurns) ? (" (" + _e.durationTurns + " turn" + (_e.durationTurns !== 1 ? "s" : "") + ")") : "">>
<li><b><<print _lab>>:</b> <<print _txt>><<print _dur>></li>
<</for>>
</ul>
<<else>>
<div class="craft-effects-none">—</div>
<</if>>
</div>
<div class="craft-descbox">
<<if _r.desc>>
<<print _r.desc>>
<<else>>
(No description.)
<</if>>
</div>
<div class="craft-actions">
<span class="craft-act craft-act-craft">
<<if _st.canCraft>>
<<button "Craft">>
<<run setup.crafting.craft(String($craft.sel)); setup.openCraftRefresh();>>
<</button>>
<<else>>
<button disabled>Craft</button>
<</if>>
</span>
<span class="craft-act craft-act-return">
<<link "Return">><<goto "Hub_1">><</link>>
</span>
</div>
<</if>>
<</nobr>>
<</widget>>
/* ======================================================
CHARACTER UI — POWERS HEADER (Limit label)
====================================================== */
<<widget "powerPanelHeader">>
<div class="char-panel-head">
<h2 class="char-panel-title">POWERS</h2>
<<powerLimitLabel>>
</div>
<</widget>>